1

看来我在未修改的实体上遇到了并发异常。我正在使用实体框架 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 服务一起使用。典型的应用流程如下。

  1. 客户端调用服务方法GetFoo。这将从数据库中检索 Foo 并将其映射到 FooDto。这还将检索相关的 Bar 并将其映射到 BarDto。
  2. 客户端更新 FooDto
  3. 客户端调用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没有改变。

为什么我会收到此异常以及如何防止它发生?

4

0 回答 0