C# 解决MemberChangeConflict与特定值的冲突

C# 解决MemberChangeConflict与特定值的冲突,c#,sql,linq,C#,Sql,Linq,我在SQL中有一个计数器,每当用户执行某个活动时,它都需要下降。有时,活动是快速而激烈的,我以ChangeConflictException结束。这很好,但当它发生时,我希望最终值是两个更改的组合 像这样的 try { db.SubmitChanges(); } catch (ChangeConflictException cce) { foreach (ObjectChangeConflict occ in db.ChangeConflicts) { f

我在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之外,没有其他东西。如何做到这一点?

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

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

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

使用该方法


(在循环处理冲突之后,不要忘记再次调用
SubmitChanges

Hmm,如果我再次调用SubmitChanges,错误可能再次发生,否?您总是可以在try/catch语句周围使用一个循环,该循环在成功提交时会中断。看起来Linq to SQL已经包装在事务作用域中(在底部),但如果我必须提取数据以检查它是否为空,我不确定这是什么情况。
mcc.Resolve(mcc.DatabaseValue + mcc.CurrentValue - mcc.OriginalValue);