Dot-Net
Linq to SQL:呼叫 SubmitChanges() 時的執行順序
我有 2 個相關的數據庫表,簡化形式如下所示
Product( product_id, name ) ProductSpecs( spec_id, product_id, name, value )外鍵通過 product_id 欄位設置,ProductSpecs 表對 (product_id, name) 對具有唯一約束。
現在在我的 ASP.NET MVC 應用程序中,當使用者編輯產品規格並保存數據時,我會刪除舊規格並將所有規格作為新規格插入。
為此,我首先呼叫 DataContext.DeleteAllOnSubmit() 並提供目前(舊)ProductSpecs 作為參數,然後將新規範添加到 Product.ProductSpecs 集合中。
然後我呼叫 DataContext.SubmitChanges() 並得到一個錯誤,表明我的唯一約束被違反了。
通過查看 DataContenxt.GetChangeText() 返回的 SQL 語句,我可以看到 INSERT 在 DELETE 之前執行(即使我在 Add 之前呼叫了 DeleteAllOnSubmit())。
這種行為的原因是什麼以及如何修復或解決它?
謝謝。
是的,出於某種原因,Linq to SQL 將所有刪除作為最後一件事執行。沒有辦法改變這一點。
或者也許有。我還沒有查看程式碼生成 DataContext 以查看我們是否可以在那裡覆蓋某些內容。
您可以根據需要多次呼叫 SubmitChanges()。當我首先需要刪除時,我的解決方法是標記我的刪除,呼叫 SubmitChanges(),然後執行插入和更新,然後再次呼叫 SubmitChanges。
您可以將所有內容包裝在 TransactionScope 中:
var deletables = from toDelete in db.NamedValues where toDelete.Name == knownValue.Name select toDelete; using (var scope = new TransactionScope()) { db.NamedValues.DeleteAllOnSubmit(deletables); db.SubmitChanges(); db.NamedValues.InsertOnSubmit(knownValue); db.SubmitChanges(); scope.Complete(); }