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

LINQ to SQL 實現資料存取通用基類:斷開模式下的 Repository 模式

     編輯:關於.NET

LINQ to SQL 提供安全、強大且靈活的資料存取方式,但在多層架構中應用並不容易。本文探討典型問題,並提供簡單、方便、可擴展的解決方案。

核心特點

  • 實現 Repository 模式,不到 10 行代碼即可完成實體 CRUD。
  • 支援斷開模式,無縫協作。
  • 單一資料庫與實體間透明更新與載入。
  • 偵錯時自動輸出執行的 SQL 語句至控制台。

多層架構下的挑戰

若在 UI 直接用 LinqDataSource 綁定資料庫,雖簡單但非面向物件,難以擴展。正規多層架構將 LINQ to SQL 置於 DAL。

連接模式 vs 斷開模式

連接模式:DataContext 在作用域內持續有效,載入與儲存同一實體極簡單。但存在嚴重併發問題,且不適用於 ASP.NET 等無狀態環境(HTTP 請求間 DataContext 失效,實體變為游離狀態)。

斷開模式:儲存時需執行四步驟:

  1. 從舊 DataContext 分離實體(序列化/反序列化)。
  2. 建立新 DataContext。
  3. 將實體附加到新 DataContext。
  4. 提交變更。

但斷開模式無法自動感知實體間關聯(如 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

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