数据库上下文 - 刷新(RefreshMode.KeepChanges);

Database Context - Refresh (RefreshMode.KeepChanges);

我有一个演示 Linq 错误的示例应用程序 Row not found or changed

数据库记录是这样的 -

在我的应用程序中,我想将员工的位置从 'London' 更新到 'Paris'。这是我的代码 -

var dbContext = new EmployeeDataContext();

var employeesInLondon = from emp in dbContext.Employees
                        where emp.Location.Equals("London")
                        select emp;

foreach (var employeeInLondon in employeesInLondon)
{
    employeeInLondon.Location = "Paris";
}

//Simulate as if another user is updating the database before you submit the update
Console.WriteLine("Now update the Employee table by running this in SQL Server Management Studio:");
Console.WriteLine("UPDATE Employee SET Location = 'Delhi', LastName = 'John' WHERE Location = 'London';");
Console.WriteLine("And hit any key...");
Console.ReadKey();

dbContext.Refresh(RefreshMode.KeepChanges); //Why the error is thrown even after adding this statement      

dbContext.SubmitChanges();

正如您在上面的代码中看到的那样 - 在提交我的更改之前,我通过 SSMS 运行 进行了不同的更新 SQL。并按预期抛出错误。

所以,我在调用 SubmitChanges() -

之前添加了以下代码
dbContext.Refresh(RefreshMode.KeepChanges);

我的问题是为什么即使我在调用 SubmitChanges() 之前刷新数据库上下文,仍然会抛出错误。我仍然收到上述代码的 ChangeConflictException。

请指导我在这里缺少什么?

仅供参考, 我在下面使用 link 创建了上面的演示,我知道如何添加 catch 块来列出冲突的 object/members - Row not found or changed - Finding the culprit

如果有冲突异常你需要解决它...即使你在保持修改的同时刷新,当你提交你的修改时仍然有一个未解决的冲突。

如果您更新上下文,刷新上下文就可以了(因此没有冲突),如果您保留更改则不行。

如果您想保留更改,请尝试执行以下操作:

try
{
   // the parameter tells it go ahead and update all non-conflicting items
   // afterwards it'll throw having all conflicting items stored
   dbContext.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException ex)
{
   foreach (ObjectChangeConflict o in dbContext.ChangeConflicts)
     o.Resolve(RefreshMode.KeepChanges); // Resolve the conflicts, not just
                                         // refresh the context
   dbContext.SubmitChanges(); // and submit again
}