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

讀寫分離架構:Entity Framework 版 SQL 分發子系統

     編輯:關於C#

背景

A2D Framework 原支援 ADO.NET 讀寫分離,現擴展支援 Entity Framework。適用場景:單寫庫、多讀庫結構一致、中小型專案。

實現步驟

1. 設計 EF 模型並轉 Code First

用設計器/Database First 建模,再切換為 Code First 使用(刪除 OnModelCreating 中拋異常的代碼)。

2. 配置文件 A2D.config


  
    server=192.168.1.20;uid=sa;pwd=111111;database=DFH
    
      server=192.168.1.21;uid=sa;pwd=111111;database=DFH
      server=192.168.1.22;uid=sa;pwd=111111;database=DFH
    
    
      
        Optimization_Sales
        server=192.168.1.23;uid=sa;pwd=111111;database=DFH
      
    
  

3. 定義查詢介面與實現

public interface IOrder {
    [SQLDispatcher] // 無參數:寫走主庫,讀從 ReadDBs 輪詢
    List QueryOrders(string keyword);

    [SQLDispatcher("Optimization_Sales")] // 顯式指定專用讀庫
    List QueryByEmail(string email);
}

[AOPServiceEnabled]
public class OrderImpl : ContextBoundObject, IOrder {
    private IRepository _repo = ObjectFactory.Resolve();
    public List QueryOrders(string k) => _repo.Get(w => w.FirstName.Contains(k));
    public List QueryByEmail(string e) => _repo.Get(w => w.Email == e);
}

4. 註冊 EF 專用組件

A2DConfig.LoadConfig();
ObjectFactory.Register();
ObjectFactory.Register(); // 內部處理分發
ObjectFactory.Register();

var svc = ObjectFactory.Resolve();
var orders = svc.QueryOrders("test");

核心機制

  • IntelligentEFRepository 攔截 LINQ 查詢,解析 SQL,交由 SqlHelperCoordinator 分發
  • DBSelector 根據 SQL 關鍵字 (INSERT/UPDATE/DELETE) 或 --WRITE 註釋判斷走主庫,否則從對應區域讀庫隨機選一個
  • DedicatedRegion 允許特定業務(如報表)走專門優化索引的讀庫

注意事項

  • 需 SQL Server 複寫保證主從數據同步(延遲自行評估)
  • 若無法搭建複寫,下一篇將介紹繞過方案
  • EF 版需目標類繼承 ContextBoundObject 以支援 AOP 攔截
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved