変更されていないエンティティで同時実行例外が発生しているようです。Entity Framework 4.3.1、Code Firstを使用していますが、これはWCFサービスで発生しています。
私の例を単純化するために、2つのエンティティがあると仮定しましょう。
public class Foo
{
public int Id { get; set; }
public string BarKey { get; set; }
public string SomeValue { get; set; }
public Bar MyBar { get; set; }
}
public class Bar
{
public string Key { get; set; }
public string OtherValue { get; set; }
public ICollection<Foo> Foos { get; set; }
}
ユーザーは、アプリケーションを介してのみFoosを編集できます。バーは表示できますが、編集することはできません。さらに、WCFサービスでDTOを使用しています。典型的なアプリケーションフローは次のとおりです。
- クライアントはサービスメソッドを呼び出します
GetFoo
。これにより、データベースからFooが取得され、FooDtoにマップされます。これにより、関連するバーが取得され、BarDtoにマップされます。 - クライアントがFooDtoを更新
- クライアントは
SaveFoo
、更新されたFooDtoを呼び出して渡します。
a。このサービスは、を使用して元のFooを再取得しcontext.Set<Foo>().Find(fooDto.Id)
、更新された値をFooDtoからコピーします。
b。を呼び出す可能性のあるビジネスロジックが実行されますcontext.Set<Bar>().Find(foo.BarKey)
。値はバーから読み取ることができますが、更新されません。
c。次に、サービスはを呼び出しますcontext.SaveChanged()
。
この時点で、たまに。を取得しDbUpdateConcurrencyException
ます。私のエラー処理では、例外がDbUpdateException
の基本クラスであるタイプの場合、DbUpdateConcurrencyException
ループしex.Entries
てログentry.Entity.GetType()
に記録しますentry.State
。
エラーログには、タイプがBar
であり、状態がであることが示されているエントリがいくつかありますUnchanged
。Bar
更新された可能性は完全にあります。ただ、変わらないので気にしませBar
ん。
なぜこの例外が発生するのですか、またそれが発生しないようにする方法は?