LINQ to SQL 提供安全、強大且靈活的資料存取方式,但在多層架構中應用並不容易。本文探討典型問題,並提供簡單、方便、可擴展的解決方案。
若在 UI 直接用 LinqDataSource 綁定資料庫,雖簡單但非面向物件,難以擴展。正規多層架構將 LINQ to SQL 置於 DAL。
連接模式:DataContext 在作用域內持續有效,載入與儲存同一實體極簡單。但存在嚴重併發問題,且不適用於 ASP.NET 等無狀態環境(HTTP 請求間 DataContext 失效,實體變為游離狀態)。
斷開模式:儲存時需執行四步驟:
DataContext 分離實體(序列化/反序列化)。DataContext。DataContext。但斷開模式無法自動感知實體間關聯(如 Customer → Bills → BillingItems),需手動遞迴附加/插入子實體,導致大量重複代碼,難以維護。
實作 RepositoryBase 泛型基類,僅需繼承並覆寫 GetIDSelector 即可:
public class CustomersRepository : RepositoryBase<Customer, DataContextSetUp>
{
protected override Expression<Func<Customer, bool>> GetIDSelector(int ID)
{
return c => c.ID == ID;
}
}
public partial class Customer
{
public static RepositoryBase<Customer, DataContextSetUp> CreateRepository()
{
return new CustomersRepository();
}
}
設定 DBML 序列化模式為 Unidirectional,即可自動處理巢狀實體的儲存與載入。基類內建 SQL 偵錯輸出(使用 DebuggerWriter)。
原文:https://devermind.com/linq/a-linq-disconnected-mode-abstract-base-class
配套原始碼:https://www.bianceng.net/dotnet/201212/725.htm