2

我在 SQL 中有一个计数器,每次用户进行活动时都需要关闭该计数器。有时活动是快速而激烈的,我最终会遇到 ChangeConflictException。这很好,但是当它发生时,我希望最终值是这两种变化的组合。

像这样的东西

try
{
    db.SubmitChanges();
}
catch (ChangeConflictException cce)
{
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        foreach (MemberChangeConflict mcc in occ.MemberConflicts)
        {
            if (mcc.DatabaseValue is int)
            {
                mcc.FinalValue = mcc.DatabaseValue + mcc.CurrentValue - mcc.OriginalValue;
            }
        }
    }
}

样本值,原始值为 50,当前值为 30(减去 20),数据库值为 40(从原始值减去 10)。最终值应为 40-20 = 20。

当然,没有 mcc.FinalValue 这样的东西。我该怎么做呢?

4

2 回答 2

1

首先,我会说要小心将大量代码添加到 catch 块中。通常最好将需要在异常后执行的代码排队。

您的问题的解决方案是使用事务首先读取数据,然后提交更改。

有关事务的示例,请参阅此堆栈溢出问题。

如何创建 LINQ to SQL 事务?

于 2013-05-24T17:59:52.717 回答
0

使用MemberChangeConflict.Resolve方法。

mcc.Resolve(mcc.DatabaseValue + mcc.CurrentValue - mcc.OriginalValue);

(并且不要忘记SubmitChanges在循环完冲突后再次调用。)

于 2013-05-24T18:01:33.610 回答