gpt4 book ai didi

entity-framework - 在 Entity Framework 中处理并发

转载 作者:行者123 更新时间:2023-12-04 08:31:42 28 4
gpt4 key购买 nike

我正在寻找在使用 Entity Framework 时处理并发的最佳方法。这里描述了最简单和最推荐(也在堆栈上)的解决方案:
http://msdn.microsoft.com/en-us/library/bb399228.aspx
它看起来像:

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

但够了吗?如果 Refresh() 和第二个 SaveChanges() 之间发生了变化怎么办?会出现未捕获的 OptimisticConcurrencyException 吗?

编辑2:

我认为这将是最终的解决方案:
    int savesCounter = 100;
Boolean saveSuccess = false;
while (!saveSuccess && savesCounter > 0)
{
savesCounter--;
try
{
// Try to save changes, which may cause a conflict.
int num = context.SaveChanges();
saveSuccess = true;
Console.WriteLine("Save success. " + num.ToString() + " updates saved.");
}
catch (OptimisticConcurrencyException)
{
// Resolve the concurrency conflict by refreshing the
// object context before re-saving changes.
Console.WriteLine("OptimisticConcurrencyException, refreshing context.");
context.Refresh(RefreshMode.ClientWins, orders);

}
}

我不确定我是否理解 Refresh() 是如何工作的。它是否刷新了整个上下文?如果是,为什么它需要额外的参数(实体对象)?还是只刷新指定的对象?
例如在这种情况下应该作为 Refresh() 第二个参数传递什么:
Order dbOrder = dbContext.Orders.Where(x => x.ID == orderID);
dbOrder.Name = "new name";
//here whole the code written above to save changes

应该是dbOrder吗?

最佳答案

是的,如果 - 正如你所说 - 在 Refresh() 之间发生变化,即使第二次保存也可能导致 OptimisticConcurrencyException和 SaveChanges() .

给出的示例只是一个非常简单的重试逻辑,如果您需要重试多次或以更复杂的方式解决冲突,最好创建一个循环重试 n 次,而不是嵌套 try/catch 比这更多单层。

关于entity-framework - 在 Entity Framework 中处理并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533945/

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