1

エンティティがデータベースに挿入されるたびに実行する必要があるコードがいくつかあります。問題は、このコードがエンティティの PrimaryKey を必要とすることです。
EntityState.Unchanged を使用して ObjectStateManager からエンティティを取得できることがわかりました。これが Insert 後のオブジェクトですが、ObjectContext の EntityState が常に「Unchanged」であるオブジェクトだけになるかどうかはわかりません。

ObjectContextで挿入されたばかりのオブジェクトに対してのみコードを実行する信頼できる方法はありますか?

4

1 に答える 1

1

はい、方法があります。SaveChanges自動的に保存した後に変更を受け入れないオーバーロードを呼び出す必要があります。代わりに、を呼び出す責任がありますAcceptAllChanges。このシナリオでは、オブジェクトは呼び出し後も追加状態のままになりますSaveChanges(ただし、呼び出すまでのみAcceptAllChanges)。一般的なコードは次のようになります。

using (var scope = new TransactionScope(...))
{
    context.SaveChanges(SaveOptions.DetectChangesBeforeSave);

    // Run your code here

    context.AcceptAllChanges();
    scope.Complete();
}

トランザクションスコープは必要ありません。これは、挿入コードをポストする場合のアプローチの単なる例であり、挿入を伴うトランザクションで実行する必要があります。

また、そのコードをオーバーライドされたものにラップしSaveChangesて、一元化された場所に配置することもできます。

于 2011-06-07T07:04:33.177 に答える