这与并发有关。因此SubmitChanges()失败,并抛出ChangeConflictException。对于db.ChangeConflicts中的每个ObjectChangeConflict,其Resolve是否设置为RefreshMode.OverwriteCurrentValues?这是什么意思?
http://msdn.microsoft.com/en-us/library/bb399354.aspx
Northwnd db = new Northwnd("...");
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
// All database values overwrite current values.
occ.Resolve(RefreshMode.OverwriteCurrentValues);
}
}
答案 0 :(得分:9)
我在代码中添加了一些注释,看看是否有帮助:
Northwnd db = new Northwnd("...");
try
{
// here we attempt to submit changes for the database
// The ContinueOnConflict specifies that all updates to the
// database should be tried, and that concurrency conflicts
// should be accumulated and returned at the end of the process.
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
// we got a change conflict, so we need to process it
Console.WriteLine(e.Message);
// There may be many change conflicts (if multiple DB tables were
// affected, for example), so we need to loop over each
// conflict and resolve it.
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
// To resolve each conflict, we call
// ObjectChangeConflict.Resolve, and we pass in OverWriteCurrentValues
// so that the current values will be overwritten with the values
// from the database
occ.Resolve(RefreshMode.OverwriteCurrentValues);
}
}
答案 1 :(得分:1)
首先,您必须了解LinqToSql跟踪每个数据库行的两种状态。原始状态和当前状态。原始状态是datacontext认为在数据库中的内容。当前状态有你的内存修改。
其次,LinqToSql使用乐观并发来执行更新。调用SubmitChanges时,datacontext将原始状态(作为过滤器)与当前状态一起发送到数据库中。如果没有修改记录(因为数据库的记录不再与原始状态匹配),则引发ChangeConflictException。
第三,要解决更改冲突,必须覆盖原始状态,以便乐观并发筛选器可以找到记录。然后你必须决定如何处理当前的状态...你可以放弃你的修改(这就是发布的代码所做的),这将导致记录没有变化,但你已经准备好继续使用当前的数据库您应用中的值。
答案 2 :(得分:0)
我认为这意味着如果它检测到冲突,请参阅计算科学下的this,然后进入捕获。在那里,它经历了每个冲突(foreach循环)并将值重置为更改尝试发生之前的值。
答案 3 :(得分:0)
显然,你对这些对象所做的任何改变都会被抛弃,因为有人在你忙碌的时候偷了你的游行并更新了数据库。在optimistic concurrency中,删除更改是唯一可行的自动解决方案。但是,如果用户花费任何时间输入丢弃的数据,用户可能不会太高兴。
答案 4 :(得分:0)
由于datacontext中的对象(在.net代码中存储和保留更改等的对象)具有其他值,而不是数据库中的对象,因此可能导致冲突。
假设你从数据库加载一个person对象。其中一个字段是firstname,firstname是S. OO。现在,您在datacontext中有一份记录副本。您更改了一些内容并希望将更改写入db,但是当(LINQ?other orm)想要将更改写入DB时,它会注意到DB中的firstname已经更改。
所以有人/某事改变了你的记录,你有一种“僵局”(正确的术语?)然后你必须定义什么是更重要的,你的变化,或某些事情/其他人做出的改变。
要点!!! - > Refreshmode.overwirteCurrentValues只刷新datacontext中的对象,它从数据库中恢复对象,以便您使用更新的对象。
我希望这有点清楚:)
grtz