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