2011-05-28 81 views
0

在向表中插入新值之前,我需要在該表的所有行中更改一個字段。 要做到這一點的最佳方法是什麼?在C#代碼中,礦石使用觸發器?如果C#可以向我展示代碼?Linq to SQL,在一次插入前更新大量數據

UPD * 問題 * 你好的新版本。在向表中插入新值之前,我需要在該表的所有行中使用特定ID更改一個字段(這是FK到另一個表)。 要做到這一點的最佳方法是什麼?在C#代碼中,礦石使用觸發器?如果C#可以向我展示代碼?

+0

在任何情況下,觸發器的工作速度都比linq to sql快,因爲LINQ不允許通過單個請求更改大量數據。 – Egor4eg 2011-05-28 21:42:14

回答

2

你可能應該考慮改變你的設計,這聽起來不會很好,如果它總是需要的話,我可能會用觸發器來做,但如果不是這樣,id使用ExecuteCommand

var ctx = new MyDataContext(); 
ctx.ExecuteCommand("UPDATE myTable SET foo = 'bar'"); 
+0

假設我有我的項目版本。如果我更新我的項目,我將保存新版本。我需要知道最後的項目是什麼。出於這個原因,只有一行應該有價值。 – Sergii 2011-05-28 21:46:31

+1

+1特別注意縮放問題;那可憐的無辜交易日誌!毫無疑問的差異備份。 – 2011-05-28 21:47:38

+1

@Sergii啊,一個時態數據庫......有幾種方法可以解決這個問題,但即使這樣也不完全是「所有行」更新 - 它只是這個項目的「最後一個活動行」更新。 。每個修訂插入一個更新的行。它也可以以追加方式完成,但找到「主動」則比較昂貴。另一種方法是單獨審計表,所以事務處理是有效的,只有 – 2011-05-28 21:50:41

0

看着你對保羅答案的評論,我覺得我應該在這裏留言。我們有幾張表格,我們需要保留表格中每個條目的歷史記錄。我們通過爲每個表創建一個單獨的表來實現它。例如,我們可能有一個Comment表,然後CommentArchive表具有外鍵引用到Comment表中的CommentId

Comment表中的觸發器可確保在Comment表中的每個時間的某些字段被更新,「舊」版本(這是通過在該觸發器的deleted表訪問)被推到CommentArchive表。顯然,這意味着每個Comment可能存在多個CommentArchive條目,但如果您只查找「活動」評論,則只需查看Comment表中的內容。如果您需要關於評論歷史的信息,則可以輕鬆使用LINQ to SQL從您感興趣的評論跳轉到引用該評論的評論存檔。

因爲我們在上面的例子中使用的觸發器只爲每個更新插入一個單獨的值到存檔表中,所以它們運行得非常快,我們獲得了很好的性能。最近我們遇到了一些問題,我試圖讓觸發器更加複雜,我們開始通過少量15個併發事務獲取死鎖。所以,教訓是你應該使這些觸發器變得簡單,並儘可能地使它們在儘可能少的表中觸摸儘可能少的行。