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をサーフィンしましたが、質問に対する答えが見つかりませんでした。説明や良い資料を手伝ってください。
データベースに既に存在することがわかっているが、現在コンテキストによって追跡されていないエンティティがある場合(これはあなたの場合に当てはまります)、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();
エンティティの状態をいつ明示的に変更済みに変更する必要がありますか?
データベースに既に存在することがわかっているが、その時点で既に変更が加えられているエンティティがある場合。あなたの例の同じシナリオ