Unchanged实体上的DbUpdateConcurrencyException

时间:2012-10-04 18:02:12

标签: .net sql-server entity-framework

似乎我在未修改的实体上遇到并发异常。我正在使用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服务。典型的应用流程如下:

  1. 客户端调用服务方法GetFoo。这将从数据库中检索Foo并将其映射到FooDto。这也将检索相关的Bar并将其映射到BarDto。
  2. 客户更新FooDto
  3. 客户电话SaveFoo并传入更新后的FooDto 一个。该服务将使用context.Set<Foo>().Find(fooDto.Id)重新检索原始Foo,然后从FooDto复制更新的值。
    湾业务逻辑运行,可以调用context.Set<Bar>().Find(foo.BarKey)。值可以从Bar中读取,但不会更新 C。然后,该服务会调用context.SaveChanged()
  4. 此时我偶尔得到DbUpdateConcurrencyException。在我的错误处理中,如果异常类型为DbUpdateException,这是DbUpdateConcurrencyException的基类,我会遍历ex.Entries并记录entry.Entity.GetType()entry.State

    在我的错误日志中,我有几个条目显示类型为Bar,状态为UnchangedBar完全可能已更新。但是,我不在乎,因为Bar没有改变。

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

0 个答案:

没有答案