我刚开始使用带有poco类的新dbContext API。现在我对并发处理没有什么问题。在我的所有表中,我都有RowVersion列(固定,计算)。 我试着遵循这个内容: http://blogs.msdn.com/b/adonet/archive/2011/02/03/using-dbcontext-in-ef-feature-ctp5-part-9-optimistic-concurrency-patterns.aspx
所以我有这样的事情:
using (var context = new UnicornsContext())
{
bool saveFailed;
var unicorn = context.Unicorns.Find(1);
unicorn.Name = "Franky";
do
{
saveFailed = false;
try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true;
// Update original values from the database
var entry = ex.Entries.Single();
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
}
} while (saveFailed);
}
但是当我挑起这个时,它不能正常工作。首先,没有DbUpdateConcurrencyException
例外,但是DbUpdateException
。
然后,当我捕获DbUpdateException时,我在var entry = ex.Entries.Single();
行收到另一个异常:
InvalidOperationException:“Sequence不包含任何元素”
答案 0 :(得分:0)
您没有检查可能已被删除的状态
var entry = dbUpdateConcurrencyException.Entries.Single();
if (entry.State == EntityState.Deleted)
{
entry.State = EntityState.Detached;
}
else
{
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
objContext.Refresh(RefreshMode.ClientWins, dbUpdateConcurrencyException.Entries.Select(e => e.Entity));
}