有人可以用英语向我解释这个MSDN代码吗?

时间:2010-07-21 20:54:01

标签: c# linq msdn

这与并发有关。因此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);
    }
}

5 个答案:

答案 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