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
そして、マッピングで「元の値を使用する」チェックボックスがオンになってい ます。
今、私がしようとすると:
そのままコードを実行すると、デバッガで調べた newRowVersion は origRowversion と同じなのですが、アプリは「else」句に入ります (そもそもなぜ同じなのか、変更しただけなのでしょうか? デバッガの問題でしょうか?)
コードを実行しますが、BREAKPOINT #1 で Management Studio の支払いオブジェクトを更新すると、SaveChanges が OptimisticConcurrencyException をスローします。これは期待通りの結果だと思います。
SQL プロファイラーを見るたびに、元のバージョンのタイムスタンプがサーバーに送信されます。
次に、タイムスタンプ値の SP マッピングで [元の値を使用] のチェックを外すと、すべてが上記と同じように機能します... わかりません。私はそれを間違ってテストしていますか?アプリはいつ「if」節に入る必要がありますか?
よろしくお願いします。
編集: Update SP マッピングの戻り値として newTimeStamp を追加しました。RowVersion の更新された値が DB から正しく取得されていることがわかります。しかし、「元の値を使用する」をオンにした場合とオフにした場合の違いはまだわかりません...