溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

LINQ to SQL是如何怎樣進(jìn)行刪除數(shù)據(jù)的

發(fā)布時(shí)間:2021-11-24 09:25:09 來源:億速云 閱讀:228 作者:柒染 欄目:編程語言

LINQ to SQL是如何怎樣進(jìn)行刪除數(shù)據(jù)的,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

我們?cè)趯W(xué)習(xí)了LINQ to SQL之查詢以及添加和更新的實(shí)現(xiàn)之后,現(xiàn)在我們來看看,LINQ to SQL是如何怎樣進(jìn)行刪除數(shù)據(jù)的,具體的實(shí)現(xiàn)過程和步驟是什么呢?讓我們來看看。

LINQ to SQL刪除數(shù)據(jù)以Northwind為例子:

1、首先以Customers表的一行數(shù)據(jù)為例,來實(shí)現(xiàn)LINQ to SQL刪除:

NorthwindDataContext ctx = new NorthwindDataContext();   Customer test1 = ctx.Customers.Single(c => c.CustomerID == "TEST1");   ctx.Customers.Remove(test1);   ctx.SubmitChanges();

2、通過查看數(shù)據(jù)庫中的Customers表,可以發(fā)現(xiàn)該條數(shù)據(jù)已經(jīng)被刪除了。

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"的一行數(shù)據(jù),然后再在數(shù)據(jù)庫中查詢?cè)摋l數(shù)據(jù),理論上來說數(shù)據(jù)庫中該數(shù)據(jù)已經(jīng)不存在了,查詢出來應(yīng)該沒有結(jié)果??墒瞧聊惠敵鰹?quot;TEST1",這是已經(jīng)被刪除的Customer的CustomerID。是不是會(huì)讓人覺得奇怪,數(shù)據(jù)庫中數(shù)據(jù)已經(jīng)不存在了,但是查詢還是可以得到正確的結(jié)果。其實(shí)原因也很簡(jiǎn)單,雖然在數(shù)據(jù)庫中該數(shù)據(jù)已經(jīng)被刪除,但是在DataContext中的Identity Cache還保存著對(duì)該對(duì)象的引用(什么是Identity Cache,前文已經(jīng)解釋過了),查詢出來的結(jié)果是在DataContext中Cache著的對(duì)象而不是存在于數(shù)據(jù)庫中的??梢灾廊绻诹硪粋€(gè)DataContext中查詢?cè)摂?shù)據(jù),肯定是查詢不到的。

3、LINQ to SQL刪除中的級(jí)聯(lián)刪除,以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為上海的訂單。執(zhí)行這段代碼,通過SQL Profile可以發(fā)現(xiàn),并沒有運(yùn)行delete from Orders...的SQL語句而是update,只是把Orders表中那條記錄的CustomerID設(shè)置為NULL,刪除的是該記錄與Customer的關(guān)系而并沒有真正刪除這條記錄。要想真正刪除該記錄必須通過DataContext來操作:

ctx.Orders.Remove(order1);   ctx.SubmitChanges();

這是在刪除過程中值得注意的一個(gè)問題。

要?jiǎng)h除Customer以及相關(guān)的Order應(yīng)該這樣來操作(也可以在數(shù)據(jù)庫中設(shè)置級(jí)聯(lián)刪除):

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();

在數(shù)據(jù)刪除時(shí)也會(huì)遇到像數(shù)據(jù)更新一樣的沖突問題,解決方法基本相同這里就不多說了。

關(guān)于LINQ to SQL是如何怎樣進(jìn)行刪除數(shù)據(jù)的問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI