首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 關聯物件 CRUD 與級聯操作實戰

     編輯:關於.NET

針對含外鍵關聯的實體(如 Publisher 1:N Book),LINQ to SQL 提供直觀的集合操作介面自動維護關聯欄位。

關聯定義與自動維護機制

Publisher.Books 為 EntitySet<Book>,建構子註冊關聯維護委托:

this._Books = new EntitySet<Book>(
    new Action<Book>(attach_Books), 
    new Action<Book>(detach_Books));
private void attach_Books(Book entity) { entity.Publisher = this; }
private void detach_Books(Book entity) { entity.Publisher = null; }

Book.Publisher 設定時同步更新 PublisherID 外鍵值,實現雙向同步。

CRUD 操作範例

新增(級聯插入)

var publisher = new Publisher { Name = "Microsoft" };
publisher.Books.Add(new Book { Title = "Expert F#" });
publisher.Books.Add(new Book { Title = "Beautiful Code" });
context.Publishers.InsertOnSubmit(publisher);
context.SubmitChanges(); // 自動處理 PublisherID 回寫與 Book 外鍵填充

更新(非傳統級聯)

var publisher = context.Publishers.Single(p => p.PublisherID == guid);
publisher.Name = "Updated";
var book = publisher.Books.First();
book.Title = "Updated Book";
context.SubmitChanges(); // 追蹤到兩個物件皆異動,各自產生 UPDATE

注意:LINQ to SQL 無所謂「級聯更新」,僅是變更追蹤機制偵測到多個物件異動並各自提交。

刪除關聯物件的陷阱

publisher.Books.Remove(book); // 呼叫 detach_Books → Book.PublisherID = Guid.Empty
context.SubmitChanges(); // 拋出異常:外鍵不可為 null

解決:在 Book.PublisherID 的 ColumnAttribute 設定 DeleteOnNull=true,Context 偵測外鍵為預設值時改執行 DELETE 而非 UPDATE。

級聯刪除

LINQ to SQL不支援級聯刪除,需手動處理或仰賴資料庫外鍵 Cascade Delete:

context.Books.DeleteAllOnSubmit(publisher.Books);
context.Publishers.DeleteOnSubmit(publisher);
context.SubmitChanges(); // 隱式交易保證原子性

查詢與載入策略

預設延遲載入:存取 publisher.Books 時才查詢。可用 DataLoadOptions 指定急切載入:

var option = new DataLoadOptions();
option.LoadWith<Publisher>(p => p.Books);
context.LoadOptions = option; // 單一 JOIN 查詢取得主從資料

多執行緒與多 DataContext 注意事項

單一 DataContext/單執行緒下運作正常,跨上下文或併發場景需注意物件追蹤與關聯載入時機,後續文章將深入探討。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved