本文接著前面的文章Linq to SQL之查詢和添加和Linq to SQL之更新,以Northwind為例子,介紹使用Linq to SQL怎樣進行刪除資料。
首先以Customers表的一行資料為例,進行資料刪除:
NorthwindDataContext ctx = new NorthwindDataContext(); Customer test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1"); ctx.Customers.Remove(test1); ctx.SubmitChanges();
通過查看資料庫中的Customers表,可以發現該條資料已經被刪除了。 接著看下面這段代碼:
NorthwindDataContext ctx = new NorthwindDataContext(); Customer test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1"); ctx.Customers.Remove(test1); ctx.SubmitChanges(); test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1"); Console.WriteLine(test1.CustomerID);
先刪除CustomerID為"TEST1"的一行資料,然後再在資料庫中查詢該條資料,理論上來說資料庫中該資料已經不存在了,查詢出來應該沒有結果。可是螢幕輸出為"TEST1",這是已經被刪除的Customer的CustomerID。是不是會讓人覺得奇怪,資料庫中資料已經不存在了,但是查詢還是可以得到正確的結果。其實原因也很簡單,雖然在資料庫中該資料已經被刪除,但是在DataContext中的Identity Cache還儲存著對該對象的引用(什麼是Identity Cache,前文已經解釋過了),查詢出來的結果是在DataContext中Cache著的對象而不是存在於資料庫中的。可以知道如果在另一個DataContext中查詢該資料,肯定是查詢不到的。
下面介紹Linq to SQL中怎樣進行串聯刪除,以Customers和Orders為例:
NorthwindDataContext ctx = new NorthwindDataContext(); Customer test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1"); Order order1 = test1.Orders.Single(o => o.ShipCity == "Shanghai"); test1.Orders.Remove(order1); ctx.SubmitChanges();
在該樣本中,欲刪除CustomerID為"TEST1"的Customer的訂單中ShipCity為上海的訂單。執行這段代碼,通過SQL Profile可以發現,並沒有運行delete from Orders...的SQL語句而是update,只是把Orders表中那條記錄的CustomerID設定為NULL,刪除的是該記錄與Customer的關係而並沒有真正刪除這條記錄。要想真正刪除該記錄必須通過DataContext來操作:
ctx.Orders.Remove(order1); ctx.SubmitChanges();
這是在刪除過程中值得注意的一個問題。
要刪除Customer以及相關的Order應該這樣來操作(也可以在資料庫中設定串聯刪除):
NorthwindDataContext ctx = new NorthwindDataContext(); Customer test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1"); foreach (Order o in test1.Orders) { test1.Orders.Remove(o); ctx.Orders.Remove(o); } ctx.Customers.Remove(test1); ctx.SubmitChanges();
在資料刪除時也會遇到像資料更新一樣的衝突問題,解決方案基本相同這裡就不多說了。