程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Linq to SQL之刪除

Linq to SQL之刪除

編輯:關於.NET

本文接著前面的文章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();

在數據刪除時也會遇到像數據更新一樣的沖突問題,解決方法基本相同這裡就不多說了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved