专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

读写分离子系统 - C# SQL分发子系统 - Entity Framework支持

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

1、 支持EF方式
2、 支持ADO.NET方式

这次来讲如何让Entity Framework变成nb的读写分离

1、 先设计EF模型, 可以图形方式设计,也可以数据库优先方式设计,总之设计完后,再转换成Code方式使用(用)

72_1.png

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 class
ObjectFactory.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, 不过先卖个关子,等下次讲。

文章永久链接:https://tech.souyunku.com/38954

未经允许不得转载:搜云库技术团队 » 读写分离子系统 - C# SQL分发子系统 - Entity Framework支持

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们