实体框架5.0处理乐观并发异常?

时间:2012-08-02 04:56:07

标签: entity-framework-5

context.SaveChanges()例外OptimisticConcurrency期间处理多个潜在异常时try { // Try to save changes, which may cause a conflict. int num = context.SaveChanges(); Console.WriteLine("No conflicts. " + num.ToString() + " updates saved."); } catch (OptimisticConcurrencyException) { // Resolve the concurrency conflict by refreshing the // object context before re-saving changes. context.Refresh(RefreshMode.ClientWins, orders); // Save changes. context.SaveChanges(); Console.WriteLine("OptimisticConcurrencyException " + "handled and changes saved"); } 。微软关于此问题的文档http://msdn.microsoft.com/en-us/library/bb399228.aspx讨论了EF 4.x ...

Refresh()

...但是在EF 5.0(RC)上,这似乎不起作用,因为我的EF5,代码优先,DbContext派生的context类上不存在context.Entry(context.SalesOrderHeaders).Reload();

我确实看到{{1}} - 但这似乎是从db重新加载而不是刷新/合并(策略客户端获胜)。

如何处理EF5中的乐观并发异常?实际上甚至在SaveChanges()中异常处理的一般指针也不错

由于

1 个答案:

答案 0 :(得分:1)

如果您的更改仅针对并发机制所涵盖的一个实体(特定的一行,而不是其他表等),则允许您通过处置旧的并刷新新的上下文来刷新上下文。 事情是当上下文被处理时,每个已更改的实体和尚未提交的实体都与上下文分离,并且更改将丢失。所以要小心你的单位工作范围!

    catch (DbUpdateConcurrencyException)
    {
        context.Dispose();
        context = new DBContext();
        Entity entity = context.Set<Entity>().Find(entityFromOldContext.Id);

        entity.Property1 = entityFromOldContext.Property1;
        entity.Property2 += 4;

        context.commit();
    }

在实体中,我使用额外属性来控制并发,如下所示:

[Timestamp]
public Byte[] RowVersion { get; set; }

这可能不是优雅的方式(并且打破了UnitOfWork模式),但它在某些情况下可能很有用,最后可替代上述帖子。