我們使用由Linq生成的查詢進行數據檢索,但對於INSERT和UPDATE,我們不允許生成SQL,但僅限於使用存儲過程。使用更新存儲過程的Linq2SQL
我將DBML中的更新和插入行爲連接到存儲過程。 程序被調用,數據被插入/更新=全部如果罰款,,除了樂觀併發。
如果在檢索和更新之間更改記錄,則更新應該失敗。
當LINQ的生成更新語句本身,它拋出一個ChangeConflictException如預期,但使用存儲過程也不例外拋出。
非常感謝您的幫助!
我們使用由Linq生成的查詢進行數據檢索,但對於INSERT和UPDATE,我們不允許生成SQL,但僅限於使用存儲過程。使用更新存儲過程的Linq2SQL
我將DBML中的更新和插入行爲連接到存儲過程。 程序被調用,數據被插入/更新=全部如果罰款,,除了樂觀併發。
如果在檢索和更新之間更改記錄,則更新應該失敗。
當LINQ的生成更新語句本身,它拋出一個ChangeConflictException如預期,但使用存儲過程也不例外拋出。
非常感謝您的幫助!
當配置UPDATE行爲以使用更新存儲過程時,Linq2SQL會生成一個方法,即不會引發併發異常。 爲了處理樂觀併發I found a proposed solution in the MSDN forums
可以實現在(ε2)DataContext類Update方法自己,並拋出一個ChangeConflictException。
要做到這一點,你必須:
WHERE columnA = OriginalValueA ...
僅更新如果值沒有改變參數
RETURN @@ROWCOUNT
partial void UpdateYourEntityClass(YourEntityClass obj) { EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj))); int result = this.YourEntityClassUpdate((...)); if (result == 0) throw new ChangeConflictException(); }
工作,但不是直截了當。 有沒有其他的選擇?
這並不讓我感到意外。當調用存儲過程來執行更新和刪除時,您將不得不做自己的併發檢查。 L2S將無法做到這一點,因爲您已經基本上使用存儲的特效將L2S從循環中刪除。
這是我們在做插入/更新/刪除操作時不使用任何存儲過程而沒有L2S後端的原因之一。使用存儲過程的另一個缺點是對插入/更新/刪除語句失去了強類型檢查。
謝謝! DBML設計器允許將INSERT,UPDATE和DELETE行爲映射到存儲過程。它還允許將原始值映射到更新存儲過程的參數。唯一缺少的部分是檢查rowcount並拋出ChangeConflictException。除了Designer.cs中生成的代碼之外,其中的所有內容都不會拋出異常。 – PeterFromCologne 2010-03-02 13:55:38