0

Update ストア プロシージャを使用して同時実行の問題を理解するのに苦労しています。私は Julie Lerman の Programming Entity Framework に従っており、彼女は例として次のコードを示しています。

using (var context = new BAEntities())
        {
            var payment = context.Payments.First();
            if (payment.PaymentDate != null)
            {
                payment.PaymentDate = payment.PaymentDate.Value.AddDays(1);
            }
            var origRowVersion = payment.RowVersion;
            try
            { //BREAKPOINT #1
                context.SaveChanges();
                var newRowVersion = payment.RowVersion;
                if (newRowVersion == origRowVersion)
                {
                    Console.WriteLine("RowVersion not updated");
                }
                else
                {
                    Console.WriteLine("RowVersion updated");
                }
            }
            catch (OptimisticConcurrencyException)
            {
                Console.WriteLine("Concurrency Exception was thrown");
            }
        }

更新 SP は次のようになります。

UPDATE payments
SET paymentdate=@date,reservationID=@reservationID,amount=@amount, modifieddate=@modifiedDate
WHERE
paymentid=@paymentid AND ROWVERSION=@rowversion 
IF @@ROWCOUNT>0
SELECT RowVersion AS newTimeStamp FROM payments WHERE paymentid=@paymentid

そして、マッピングで「元の値を使用する」チェックボックスがオンになってい ます。

今、私がしようとすると:

  1. そのままコードを実行すると、デバッガで調べた newRowVersion は origRowversion と同じなのですが、アプリは「else」句に入ります (そもそもなぜ同じなのか、変更しただけなのでしょうか? デバッガの問題でしょうか?)

  2. コードを実行しますが、BREAKPOINT #1 で Management Studio の支払いオブジェクトを更新すると、SaveChanges が OptimisticConcurrencyException をスローします。これは期待通りの結果だと思います。

SQL プロファイラーを見るたびに、元のバージョンのタイムスタンプがサーバーに送信されます。

次に、タイムスタンプ値の SP マッピングで [元の値を使用] のチェックを外すと、すべてが上記と同じように機能します... わかりません。私はそれを間違ってテストしていますか?アプリはいつ「if」節に入る必要がありますか?

よろしくお願いします。

編集: Update SP マッピングの戻り値として newTimeStamp を追加しました。RowVersion の更新された値が DB から正しく取得されていることがわかります。しかし、「元の値を使用する」をオンにした場合とオフにした場合の違いはまだわかりません...

4

1 に答える 1