【问题标题】:Can Someone Explain This MSDN Code To Me In English?有人可以用英语向我解释这个 MSDN 代码吗?
【发布时间】:2010-07-21 20:54:01
【问题描述】:

这是并发相关的。所以 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);
    }
}

【问题讨论】:

    标签: c# linq msdn


    【解决方案1】:

    我在代码中添加了一些cmets,看看是否有帮助:

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

    【讨论】:

      【解决方案2】:

      首先,您必须了解 LinqToSql 为每个数据库行跟踪两个状态。原始状态和当前状态。原始状态是数据上下文认为数据库中的状态。当前状态有你在内存中的修改。

      其次,LinqToSql 使用乐观并发来执行更新。当调用 SubmitChanges 时,datacontext 将原始状态(作为过滤器)与当前状态一起发送到数据库中。如果没有记录被修改(因为数据库的记录不再匹配原始状态),则会引发 ChangeConflictException。

      第三,要解决变更冲突,您必须覆盖原始状态,以便乐观并发过滤器可以找到记录。然后你必须决定如何处理当前状态......你可以放弃你的修改(这就是发布的代码所做的),这不会导致记录发生任何变化,但你已经准备好继续使用当前数据库应用中的值。

      【讨论】:

        【解决方案3】:

        我认为这意味着如果它检测到冲突,请参阅计算科学下的this,然后它就会陷入困境。在其中,它会遍历每个冲突(foreach 循环)并将值重置为尝试发生更改之前的值。

        【讨论】:

          【解决方案4】:

          显然,您对对象所做的任何更改都将被丢弃,因为其他人在您忙碌时偷走了您并更新了数据库。在optimistic concurrency 中,删除更改是唯一可能的自动化解决方案。但是,如果用户花时间输入丢弃的数据,他们可能不会太高兴。

          【讨论】:

            【解决方案5】:

            冲突可能是由于数据上下文中的对象(在 .net 代码中存储和保持更改等的对象)具有其他值而不是数据库中的值。

            假设您从数据库加载了一个人对象。其中一个字段是名字,名字是 S 哦。现在,您在 datacontext 中有一份记录的副本。您更改了一些内容并希望将更改写入数据库,但是当(LINQ?其他 orm)想要将更改写入数据库时​​,它注意到数据库中的名字已经更改。

            所以某人/某事改变了你的记录,你有一种“僵局”(正确的术语?)然后你必须定义更重要的是什么,你的更改,或某事/其他人所做的更改。

            重点!!! -> Refreshmode.overwirteCurrentValues 只是刷新数据上下文中的对象,它从数据库中重新加载对象,以便您使用更新的对象。

            我希望这有点清楚:)

            grtz

            【讨论】:

              猜你喜欢
              • 2017-01-16
              • 1970-01-01
              • 2011-08-20
              • 1970-01-01
              • 2022-12-16
              • 2018-03-28
              • 2011-05-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多