似乎我在未修改的实体上遇到并发异常。我正在使用Entity Framework 4.3.1,Code First,这发生在WCF服务中。
为了简化我的例子,我们假设我有两个实体。
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。条形图可以查看,但不能编辑。此外,我使用DTO与WCF服务。典型的应用流程如下:
GetFoo
。这将从数据库中检索Foo并将其映射到FooDto。这也将检索相关的Bar并将其映射到BarDto。SaveFoo
并传入更新后的FooDto
一个。该服务将使用context.Set<Foo>().Find(fooDto.Id)
重新检索原始Foo,然后从FooDto复制更新的值。context.Set<Bar>().Find(foo.BarKey)
。值可以从Bar中读取,但不会更新
C。然后,该服务会调用context.SaveChanged()
。此时我偶尔得到DbUpdateConcurrencyException
。在我的错误处理中,如果异常类型为DbUpdateException
,这是DbUpdateConcurrencyException
的基类,我会遍历ex.Entries
并记录entry.Entity.GetType()
和entry.State
在我的错误日志中,我有几个条目显示类型为Bar
,状态为Unchanged
。 Bar
完全可能已更新。但是,我不在乎,因为Bar
没有改变。
为什么我会遇到此异常以及如何防止它发生?