多个SaveChanges时会发生实体框架乐观并发异常

时间:2017-06-03 01:52:33

标签: c# entity-framework

我使用Entity Framework 6.在我的代码中调用SaveChanges方法两次后,DeleteObject之后发生了ConcurrencyException

entities.DeleteObject(pu);

// First time           
entities.Context.SaveChanges(SaveOptions.None);

// everything is ok

// Second Time     
entities.Context.SaveChanges(SaveOptions.None);

// Concurrency exception

但是使用AddObject时没有发生此异常!

异常消息是:

  

存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。处理乐观并发异常。

如何在没有并发异常的SaveChanges之前控制多个AcceptAllChanges调用?

2 个答案:

答案 0 :(得分:1)

你在第二次保存之前调用AcceptAllChanges()方法吗?我的理解是,如果您使用SaveOptions.None,上下文会保留更改,以便可以将它们重新提交到数据库。如果第一个SaveChanges()成功,则比在db中更新rowversion,但在上下文中,所有内容都保持不变,因此第二次导致rowversion发生冲突。

答案 1 :(得分:0)

您可以使用交易



var yourContext = ((IObjectContextAdapter)db).ObjectContext;

try {
    yourContext.Connection.Open();
    using (var transaction = new TransactionScope()) {
        
        //you can implement entities.DeleteObject(pu) here

        db.SaveChanges();

        // Do something else

        db.SaveChanges();

        transaction.Complete();
    }
} finally {
    yourContext.Connection.Close();
}