2010-03-01 62 views
4

我們使用由Linq生成的查詢進行數據檢索,但對於INSERT和UPDATE,我們不允許生成SQL,但僅限於使用存儲過程。使用更新存儲過程的Linq2SQL

我將DBML中的更新和插入行爲連接到存儲過程。 程序被調用,數據被插入/更新=全部如果罰款,,除了樂觀併發

如果在檢索和更新之間更改記錄,則更新應該失敗。

當LINQ的生成更新語句本身,它拋出一個ChangeConflictException如預期,但使用存儲過程也不例外拋出。

非常感謝您的幫助!

回答

3

當配置UPDATE行爲以使用更新存儲過程時,Linq2SQL會生成一個方法,即不會引發併發異常。 爲了處理樂觀併發I found a proposed solution in the MSDN forums

可以實現在(ε2)DataContext類Update方法自己,並拋出一個ChangeConflictException

要做到這一點,你必須:

  • 寫的更新存儲過程與使用WHERE columnA = OriginalValueA ...僅更新如果值沒有改變參數
    • 這需要電流和原始值
    • 存儲過程中的最後一行是RETURN @@ROWCOUNT
    • rowcount讓您看到該行是否已更新
  • 在DBML
  • 設定的更新行爲「使用運行時」
  • 部分類xxxDataContext實現更新的方法是這樣的:
    • 的代碼是從什麼LINQ2SQL產生,只是最後一行取拋出異常添加
partial void UpdateYourEntityClass(YourEntityClass obj) 
     { 
      EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj))); 
      int result = this.YourEntityClassUpdate((...)); 
      if (result == 0) throw new ChangeConflictException(); 
     } 

工作,但不是直截了當。 有沒有其他的選擇?

0

這並不讓我感到意外。當調用存儲過程來執行更新和刪除時,您將不得不做自己的併發檢查。 L2S將無法做到這一點,因爲您已經基本上使用存儲的特效將L2S從循環中刪除。

這是我們在做插入/更新/刪除操作時不使用任何存儲過程而沒有L2S後端的原因之一。使用存儲過程的另一個缺點是對插入/更新/刪除語句失去了強類型檢查。

+0

謝謝! DBML設計器允許將INSERT,UPDATE和DELETE行爲映射到存儲過程。它還允許將原始值映射到更新存儲過程的參數。唯一缺少的部分是檢查rowcount並拋出ChangeConflictException。除了Designer.cs中生成的代碼之外,其中的所有內容都不會拋出異常。 – PeterFromCologne 2010-03-02 13:55:38