web-dev-qa-db-ja.com

Entity Framework 6の更新にAttachを使用する理由

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

_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 bookおよび the tutorial の関連する章を読みましたが、2クエリアプローチを使用しています。また、SOをサーフィンしましたが、質問に対する答えが見つかりませんでした。説明や良い資料を手伝ってください。

10
Vitalii Isaenko

データベースに既に存在することがわかっているが、現在コンテキストによって追跡されていないエンティティがある場合(これはあなたの場合に当てはまります)、Attachメソッドを使用してエンティティを追跡するようにコンテキストに指示できますDbSet。要約すると、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(); 

エンティティの状態をいつ明示的に変更済みに変更する必要がありますか?

データベースに既に存在することがわかっているが、その時点で既に変更が加えられているエンティティがある場合。あなたの例の同じシナリオ

24
octavioccl