Dot-Net

Linq to SQL:呼叫 SubmitChanges() 時的執行順序

  • January 15, 2009

我有 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();
   }

引用自:https://stackoverflow.com/questions/445985