数据库上下文 - 刷新(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
}
我有一个演示 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
}