gpt4 book ai didi

entity-framework-5 - Entity Framework 5.0 处理乐观并发异常?

转载 作者:行者123 更新时间:2023-12-03 13:52:45 24 4
gpt4 key购买 nike

context.SaveChanges() 期间处理多个潜在异常时异常(exception)之一是 OptimisticConcurrency . Microsoft 在 http://msdn.microsoft.com/en-us/library/bb399228.aspx 上的相关文档为 EF 4.x 讨论这个...

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");
}

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

我确实看到了 context.Entry(context.SalesOrderHeaders).Reload(); - 但这似乎是直接从数据库重新加载而不是刷新/合并(策略客户端获胜)。

任何想法如何处理 EF5 中的乐观并发异常?实际上,即使是关于 SaveChanges() 中异常处理的一般指针也会很好

谢谢

最佳答案

DbContext API中如何解决并发异常的方法是重新加载原始实体:

catch (DbUpdateConcurrencyException ex)
{
// Get failed entry
var entry = ex.Entries.Single(...);
// Overwrite original values with values from database but don't
// touch current values where changes are held
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
}

您也应该能够使用上述代码,但您必须获得 ObjectContext来自您的 DbContext 的实例实例(它只是 ObjectContext 的包装器)。
catch (DbUpdateConcurrencyException ex)
{
var objContext = ((IObjectContextAdapter)context).ObjectContext;
// Get failed entry
var entry = ex.Entries.Single(...);
// Now call refresh on ObjectContext
objContext.Refresh(RefreshMode.ClientWins, entry.Entity);
}

你甚至可以尝试:
objContext.Refresh(RefreshMode.ClientWins, ex.Entries.Select(e => e.Entity));

关于entity-framework-5 - Entity Framework 5.0 处理乐观并发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11771267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com