在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()中异常处理的一般指针也不错
由于
答案 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模式),但它在某些情况下可能很有用,最后可替代上述帖子。