我使用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
调用?
答案 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();
}