2017-01-11 5 views
5

FE6の変更トラッキングで何かを理解するのが苦労しています。ToList()を呼び出した後のエンティティフレームワークの変更トラッキング

私はこのようなコードを持っています。

public class SomeClass 
{ 
    private List<User> _users; 
    private DAL _dal; 

    public void ProcessUsers() 
    { 
     _users = _dal.GetUsers(); 

     foreach(var u in users) 
     { 
      u.user.Comment = "This is a test"; 
     } 

     _dal.SaveChanges(); 
    } 
} 

DALクラスはこれと少し似ています。

public class DAL 
{ 
    ... 
    private DataContext _context; // Assume that this is being newed up in a constructor. 

    public List GetUsers() 
    { 
     return _context.Users.ToList(); 
    } 

    public void SaveChanges() 
    { 
     _context.SaveChanges(); 
    } 
} 

だから我々はProcessUsersメソッドのコードから見ることができるよう、私たちはユーザーのリストを持っていると我々はそのリストを変更しています。

今私はこれがうまくいくことを知っていますが、私はいつもそれをやっていますが、私はいつもList(この例ではUsers)のオブジェクトがDBSet Localの対応するオブジェクトコレクション。

少し考えた後で、コンテキストが削除されているかのように私は確信していませんが、リストはまだ入力されていて操作できます(追加作業をせずにデータベースに戻す機能が緩んでいます)。 )そのような観点からは、リスト内の項目はDBSet Localコレクションの項目のコピーでなければなりませんが、それが当てはまる場合は、リスト内のオブジェクトを操作するとオブジェクトに何らかの影響を及ぼすことはありませんdbsetではコピーと同じように扱われます。

概要で

質問は、私がDBSetにToListメソッドを呼び出すときに何が起こるかで、どのようにこのインスタンスで作業を追跡変更するのでしょうか? - それはうまくいくのは分かっていますが、私の現在の理解は間違っていると思います。

答えて

0

更新されたオブジェクトをマークするにはcontext.TableName.Update(obejct)を使用する必要があります。次だからあなたの例

public void ProcessUsers() 
{ 
    _users = _dal.GetUsers(); 

    foreach(var u in users) 
    { 
     u.user.Comment = "This is a test"; 
     _dal.Users.Update(u); 
    } 

    _dal.SaveChanges(); 
} 
+0

まあ、いいえ、私の意見は、私が掲載したコードが壊れていないということです。 私は、DBSetのToList()が何をしているか理解したいだけです。リストにdbset Localコレクションの元のオブジェクトへの参照が設定されたとします。しかし、私が読んでいないものから、それらはコピーです - もしそうなら、変更の追跡はうまくいかず、上記のコードは失敗します。 – D3vy

1

EFは、すべての保留中の変更が追跡され、コレクション(_context.ObjectStateManagersee here...)を持っているにcontext.Savechanges();を使用して変更を保存します。さらに多くのエンティティをEFでロードすると、実際のエンティティクラスではなくプロキシインスタンスが取得されます。このプロキシを使用すると、EFは、変更追跡情報を更新するエンティティインスタンスにコードを「注入」します。

コンテキストを破棄すると、この情報は失われます。既存のエンティティインスタンスを別のコンテキストに追加するには、_context.Attach()メソッドを使用できます。

SaveChanges()は、_context.ObjectStateManagerの情報を処理します。

+0

こんにちは、私は私の質問ではっきりしているとは思わない、私は変更の追跡の仕組みを知っている、上の例のコードが動作します。私が尋ねるのは、DBSetのtoListを呼び出すときに、そのリストに入るもの... dbSet内の項目のコピーまたはそれらのオブジェクトへの参照ですか?仕事をしている人に掘り下げたり話したりした後、リストにはコピーではなくdbSetの内容への参照が設定されている必要があります。 – D3vy

関連する問題