在ef 4.1 dbContext api中处理并发

时间:2012-03-16 14:35:09

标签: entity-framework concurrency dbcontext

我刚开始使用带有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不包含任何元素”

1 个答案:

答案 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));
}