我在使用更新存儲過程瞭解併發問題時遇到了一些困難。我下面的朱莉·勒曼的編程實體框架和她給出了一個例子,下面的代碼:使用更新存儲過程的實體框架樂觀併發性(Julie Lerman示例)
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 [email protected],[email protected],[email protected], [email protected]
WHERE
[email protected] AND [email protected]
IF @@ROWCOUNT>0
SELECT RowVersion AS newTimeStamp FROM payments WHERE [email protected]
和「使用原始值」複選框中打勾映射,它看起來像這樣: https://dl.dropboxusercontent.com/u/135754/updatemapping.png
現在,當我嘗試:
按照原樣運行代碼,然後在調試器中檢查的newRowVersion與origRowversion相同,但應用程序輸入'else'子句(爲什麼它首先是相同的,我剛剛更改了它?是它調試器的問題?)
運行代碼,但在BREAKPOINT#1我更新Management Studio中的付款對象,SaveChanges引發OptimisticConcurrencyException。我認爲這是預期的結果。
每次查看SQL事件探查器時,都會將原始版本的時間戳發送到服務器。
然後,當我在時間戳值的SP映射中取消「使用原始值」時,所有操作都與上面描述的方式相同......我不明白這一點。我測試它錯了嗎?應用何時應該輸入'if'條款?
在此先感謝,歡呼!
編輯: 我添加了newTimeStamp作爲Update SP映射的返回值。現在我可以看到RowVersion的更新值是從DB正確取出的。但我仍然看不到有「使用原始值」選中和取消選中之間的區別...