0

我在使用更新存儲過程瞭解併發問題時遇到了一些困難。我下面的朱莉·勒曼的編程實體框架和她給出了一個例子,下面的代碼:使用更新存儲過程的實體框架樂觀併發性(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

現在,當我嘗試:

  1. 按照原樣運行代碼,然後在調試器中檢查的newRowVersion與origRowversion相同,但應用程序輸入'else'子句(爲什麼它首先是相同的,我剛剛更改了它?是它調試器的問題?)

  2. 運行代碼,但在BREAKPOINT#1我更新Management Studio中的付款對象,SaveChanges引發OptimisticConcurrencyException。我認爲這是預期的結果。

每次查看SQL事件探查器時,都會將原始版本的時間戳發送到服務器。

然後,當我在時間戳值的SP映射中取消「使用原始值」時,所有操作都與上面描述的方式相同......我不明白這一點。我測試它錯了嗎?應用何時應該輸入'if'條款?

在此先感謝,歡呼!

編輯: 我添加了newTimeStamp作爲Update SP映射的返回值。現在我可以看到RowVersion的更新值是從DB正確取出的。但我仍然看不到有「使用原始值」選中和取消選中之間的區別...

回答

0

我想我現在明白了。 當我嘗試調用的SaveChanges然後之前手動更改rowversion(以隨機的byte []):

  1. 使用原始值不選擇:「隨機字節[]」被髮送到數據庫,並在更新中使用存儲過程(在WHERE子句中),導致OptimisticConcurrencyException
  2. 使用原始值檢查:該值rowversion有當它最初被從數據庫下載的發送和使用更新存儲過程(WHERE子句中)

我想這就是Use Original Value的用途......對我來說,這似乎有點奇怪,你是誰ld在相同的dbcontext中手動更改它?