程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 讀寫分離子系統 - C# SQL分發子系統 - Entity Framework支持

讀寫分離子系統 - C# SQL分發子系統 - Entity Framework支持

編輯:關於C#

A2D Framework增加了EF支持,加上原先支持ADO.NET:

支持EF方式

支持ADO.NET方式

這次來講如何讓Entity Framework變成nb的讀寫分離

1. 先設計EF模型, 可以圖形方式設計,也可以數據庫優先方式設計,總之設計完後,再轉換成 Code方式使用(用)

2. 在DbContext類中,刪除EF自動添加的報錯代碼,如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
            throw new UnintentionalCodeFirstException();//直接刪除這句
}

3. 在根目錄中增加A2D配置文件A2D.config:

<?xml version="1.0" encoding="utf-8" ?>
<A2D>
  <SQLDispatcher>
    <WritableDB>server=192.168.1.20;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</WritableDB>
    <ReadDBs>
      <DB>server=192.168.1.21;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</DB>
      <DB>server=192.168.1.22;User ID=sa;Password=111111;database=DFH;Connection Reset=FALSE</DB>
    </ReadDBs>
  </SQLDispatcher>
</A2D>

4. 編寫查詢接口、查詢Impl

interface IOrder
{
        [SQLDispatcher]
        List<Order> QueryOrders(string keyword);
}
    
[AOPServiceEnabled]
class OrderImpl : ContextBoundObject, IOrder
{
         private IRepository repository = ObjectFactory.Resolve<IRepository>();
    
        public List<Order> QueryOrders(string keyword)
        {
             List<Order> orders=repository.Get<Order>(filter: w => 

w.FirstName.IndexOf(keyword)>=0);
             return orders;
        }
}

5. 注入EF的SQL Dispatcher對象

A2DConfig.LoadConfig();
    
ObjectFactory.Register<DbContext, MyEntities>();//MyEntities是第二步中T4生成的那個

DbContext classObjectFactory.Register<IRepository, IntelligentEFRepository>();
    
ObjectFactory.Register<IOrder, OrderImpl>();//注冊Order的實現邏輯類
    
var bl = ObjectFactory.Resolve<IOrder>();
    
List<Order> orders=bl.QueryOrders("test");

搞定。

其他:A2D.config中,還可以加入Region的概念,如下:

<SQLDispatcher>
    <WritableDB>Server=.;Database=d1;User Id=sa;Password=111111;</WritableDB>
    <ReadDBs>
      <DB>Server=.;Database=d2;User Id=sa;Password=111111;</DB>
      <DB>Server=.;Database=d3;User Id=sa;Password=111111;</DB>
      <DB>Server=.;Database=d4;User Id=sa;Password=111111;</DB>
    </ReadDBs>
    <DedicatedReadDBs>
      <DedicatedRegion>
        <Region>Optimization_Sales</Region>
        <DB>Server=.;Database=d5;User Id=sa;Password=111111;</DB>
        <DB>Server=.;Database=d6;User Id=sa;Password=111111;</DB>
      </DedicatedRegion>
      <DedicatedRegion>
        <Region>Optimization_HR</Region>
        <DB>Server=.;Database=d7;User Id=sa;Password=111111;</DB>
      </DedicatedRegion>
    </DedicatedReadDBs>
  </SQLDispatcher>

也就是所有的讀操作可以刻意指定由哪台db來處理,比如某台server性能比較好,或者某台server 專門給某語句做了極端優化。。。

此時就能用上面這個配置文件,當然C#那邊也要修改成匹配的Region:

interface IOrder

{

       [SQLDispatcher("Optimization_Sales")]  //這樣, 這句sql調用就會被redirect到專門為sales做過優化的那台server(也能支持多台)了

       List<Order> QueryOrders(string keyword);

}

Caution:這種技術需要搭配Sql server的復制高級功能才能實現數據在master與slaves之間復制, 這個技術請大家自己搞定吧(考慮到底延時),我沒有多少經驗(demo過而已,你懂的,哈哈,請大家 請教真正的DBA來做這事吧)

BUT:其實,有個辦法能繞過上面這個Caution, 不過先賣個關子,等下次講。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved