看来我在未修改的实体上遇到了并发异常。我正在使用实体框架 4.3.1,代码优先,这发生在 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。 - 客户端更新 FooDto
- 客户端调用
SaveFoo
并传入更新的 FooDto。
一个。该服务将使用 重新检索原始 Foo,context.Set<Foo>().Find(fooDto.Id)
然后从 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
没有改变。
为什么我会收到此异常以及如何防止它发生?