2013-01-11 8 views

答えて

9

エンティティフレームワークはDbContextを使用して作業パターンの単位を実装します。これは、データベースにしたいことのパッケージを定義してから、変更を保存して一度にデータベースに伝えることを意味します。すべての操作は、単一のトランザクション(1つのsaveChanges呼び出し)で実行されます。つまり、allまたはnoneが一度にデータベースに伝播されます。

変更を保存する前に、変更はローカルトラッキンググラフに適用されますが、savechangesが呼び出されるまでデータベース自体には適用されません。

+0

ローカルのDbContextが破棄された後もローカルの追跡グラフが保持されますか? –

+0

'DbContext'が破棄される前に' SaveChanges() 'を呼び出さなければ、どこで呼び出すべきですか? –

+1

コンテキストを破棄すると保留中の変更は破棄され、コンテキストのライフサイクルのトラッキンググラフのみが存在するため、コンテキストが破棄されます。 –

1

はい。

すべての変更は、context.SaveChanges();が呼び出されるまで保存されません。

あなたは(absolutlyあなたが与えた状況ではない)他のDbContextからオブジェクトを持つことになります場合は、代わりにこれらのコード行を使用して明示的に実体の状態を変更する必要がなければならないことに注意してください。

Item item = new Item("item1") 
db.Entry(item).State = EntityState.Modified; 
db.SaveChanges(); 
+0

一般的な作業単位では、ユーザー操作によるすべての変更が一度に発生する必要があります。ほとんどの場合、これはDbContextのインスタンスにまたがるべきではないことを意味します。もしあなたが.Attach - > make change - > SaveChangesであるならば、これはうまくいくメソッドです。明示的な変更フラグを使用した唯一の時間は、EFの上部(ジェネリックリポジトリなど)の上に他のデータコンテキストを導入することです。 –

関連する問題