2016-12-07 46 views
5

EFを使ってCRUD操作を実行するためのベストプラクティスを検索しながら、エンティティを更新する前にAttach()またはFind()メソッドを使用することを強くお勧めします。それはうまく動作し、EFのドキュメントによれば、これらのメソッドはエンティティをコンテキストにフェッチしてくれます。しかし、後続のコードは私をかなり混乱させました。Entity Framework 6の更新にAttachを使用する理由

public void Update(object entity) 
{ 
    Record record = new Record() { 
     id = 1, 
     value = 5 
    }; 
    using (SomeContext ctx = new SomeContext()) 
    { 
     ctx.Entry(record).State = EntityState.Modified; 
     ctx.SaveChanges(); 
    } 
} 

データベースにid = 1のレコードがあるとします。この状態で上記のコードはレコードを更新します(値を5に設定)。問題はそれがなぜ機能するのか?そして、なぜ私はAttach()を使うべきですか?私が理解している限り、その記録は文脈には決して添付されませんでした。私はthis本とthe tutorialの関連する章を読んでいますが、2つのクエリーアプローチを使用しています。また、私はSOをサーフしましたが、私の質問に答えが見つかりませんでした。説明や良いmatherialsで私を助けてください。

答えて

12

データベースに既に存在しているが、現在コンテキストによってトラッキングされていないエンティティがある場合は、DbSetAttachメソッドを使用してエンティティを追跡するようにコンテキストに指示できます。だから要約するとAttachメソッドは、コンテキスト内のエンティティを追跡し、その状態をUnchangedに変更します。それ以降のプロパティを変更すると、トラッキングの変更によって状態がModifiedに変更されます。 上記の場合は、状態がModifiedであることを明示していますが、エンティティもコンテキストに添付します。詳細はpostにあります。

Attachの方法はいつ使用しますか?あなたが既に知っているデータベースに存在しますが、いくつかの変更をしたいエンティティを持っている場合は

は:

var entity= new Entity{id=1}; 
context.YourDbSet.Attach(entity); 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

これは同じです:

context.Entry(entity).State = EntityState.Unchanged; 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

を変更すべき場合には、企業の状態を明示的に変更するか?

あなたが知っているエンティティがすでにデータベースに存在していて、変更が既に行われている場合。あなたの例の同じシナリオ

+0

ありがとう、しかし、このレコードは現在、コンテキストによって追跡されている理由はありますか? –

+0

エンティティが現在追跡されていて、一部のプロパティを変更した場合、エンティティの状態はトラッキングの変更によって「Modified」に変更されますが、エンティティはこの[要件]を満たす必要があります(https://msdn.microsoft.com/ en-us/library/dd468057(v = vs.100).aspx) – octavioccl

+0

私はこれを[リンク](https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449331825/ch04s03.html)と考えています。 )あなたのすべての質問に回答することができます – octavioccl

関連する問題