2016-10-15 12 views
0

EFを使用してupdate single field in my databaseする必要がありました。私はこのようにそれのようにやっている:EFを使用して特定のプロパティを更新

1 - 名

2に基づいてテーブルからorginalレコードをロード - 更新フィールド値

3 - DBに戻ってオブジェクトを保存

コード:

public void UpdateUser(List<User> users) 
{ 
    foreach (User user in users) 
    { 
     Job original = _context.Users.Where(x => x.Name == user.Name).AsNoTracking().FirstOrDefault(); 
     if (original != null) 
     {     
      original.Name = user.Nanme; 
      _context.Entry(original).State = EntityState.Modified; // not sure it is needed or not 
     } 
     _context.SaveChanges();   

    } 
} 

は、効率的な方法ですか?それとも私はもっと良い方法でそれをすることができますか?

答えて

0

名前に基づいてテーブルから元のレコードをロードします。

これは本当に良いプラクティスではありません、あなたはforeachのうち側でなければなりませんid

Job original = _context.Users.Where(x => x.id== user.id).AsNoTracking().FirstOrDefault(); 

そして_context.SaveChanges();に基づいて、レコードを取得する必要がありますので、更新は一度実行されます。

_context.Entry(original).State = EntityState.Modified;は、エンティティがコンテキストによって追跡され、データベースに存在し、そのプロパティ値の一部またはすべてが変更されていることを示します。

だから、最終的にあなたのコードは次のようになります。

foreach (User user in users) 
{ 
    Job original = _context.Users.Where(x => x.id== user.id).AsNoTracking().FirstOrDefault(); 
    if (original != null) 
    {     
    original.Name = user.Nanme; 
    _context.Entry(original).State = EntityState.Modified; 
    }      
} 
_context.SaveChanges(); 

・ホープ、このことができます! EFは、トラックを持っている場合、この場合の

foreach (var usr in users) 
{ 
    var user = new User { Id = usr.Id, Name = usr.Name }; 
    _context.Users.Attach(user); 
    _context.Entry(user).Property(x => x.Name).IsModified = true; 
} 

_context.SaveChanges(); 

:あなただけNameフィールドを更新し、再フェッチ全体実体なしにしたい場合は、あなたがこれを行うことができますどのようにこのことについて、

foreach (User user in users) 
{ 
    _context.Users.Find(user.id).Name = user.Name; 
}      
_context.SaveChanges(); 
+1

EFは何の 'original'エンティティのトラックを持っていないし、エンティティを装着せずに、' original'が更新されません。 –

+0

ありがとう! @MohsenEsmailpour、答えが更新されました。 –

+0

あなたは私と同じことを言った。どのように違うのですか? – simbada

0

あなたがuserを添付している場合、例外が発生し、添付する必要はありません。

他の方法は、SQLコマンドを使用していない:

_context.Database.ExecuteSqlCommand("UPDATE dbo.Users SET Name = @Name WHERE Id = @Id", 
    new SqlParameter("@Name", user.Name), 
    new SqlParameter("@Id", user.Id)); 
0

+0

私は理解できませんでした "この例では、EFにユーザーの追跡がある場合、ユーザーを接続すると例外が発生し、添付する必要はありません。 – simbada

+0

詳細については、[this post](http://stackoverflow.com/questions/24355268/error-occurring-when-entity-state-is-modified/24355588)を参照してください。 –

関連する問題