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 に答える