读写分离子系统 - C# SQL分发子系统 - Entity Framework支持
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=;database=DFH;Connection Reset=FALSE</WritableDB>
<ReadDBs>
<DB>server=192.168.1.21;User ID=sa;Password=;database=DFH;Connection Reset=FALSE</DB>
<DB>server=192.168.1.22;User ID=sa;Password=;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)>=);
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, 不过先卖个关子,等下次讲。
读写分离子系统 - C# SQL分发子系统 - Entity Framework支持的更多相关文章
- 读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF)
读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF) 这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系 ...
- 读写分离子系统 - C# SQL分发子系统(目前只支持ADO.NET)
这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系统适用的场景: 我们来看这个子系统的配置文件: <?xml vers ...
- Executing Raw SQL Queries using Entity Framework
原文 Executing Raw SQL Queries using Entity Framework While working with Entity Framework developers m ...
- [VSTS]让ADO.NET Entity Framework支持Oracle数据库(转载)
近期由于项目所需不得不研究Oracle数据库,回想上一次用Oracle还是07年的事情,实习时候做华晨宝马的项目简单接触了Oracle.这次的项目需要基于.NET平台,我个人的习惯是能用微软自带的就不 ...
- Entity Framework入门教程: Entity Framework支持的查询方式
Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从V ...
- 让ADO.NET Entity Framework支持Oracle数据库
Oracle最近发布了 Oracle Data Access Component(ODAC)11. 2 Rel 4,其中增加了对 Entity Framework 4.1 和4.2的支持.这让 .NE ...
- 让ADO.NET Entity Framework 支持ACCESS数据库
如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 接到一个程序和网页交互的项目,用ADO.NET ...
- Entity Framework 支持 DataTable
转载:http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html https://www.cnblogs.com/hanjun0612 ...
- 让Entity Framework支持MySql数据库(转载)
转载地址:http://www.cnblogs.com/wintersun/archive/2010/12/12/1903861.html Entity Framework 4.0 也可以支持大名鼎鼎 ...
随机推荐
- <自动化测试方案_5>第五章、代码单元自动化测试
第五章.代码单元自动化测试 代码单元测试需要根据编程语言,选择单元测试框架,然后访问类方法,函数.代码单元测试做自动化,相比API.UI自动化做起来更加麻烦,建议放到待API自动化测试.UI自动化测试 ...
- selenium+pyquery爬取淘宝美食100页(无头静默模式)
import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.w ...
- 浅析C/C++中的switch/case陷阱
浅析C/C++中的switch/case陷阱 先看下面一段代码: 文件main.cpp #include<iostream> using namespace std; int main(i ...
- Scala类型限定
package big.data.analyse.scala /** * 类型限定 * Created by zhen on 2018/12/9. */ object Lxxd { def main( ...
- spring4笔记----依赖注入的两种形式
设值注入:通过<property.../>元素驱动Spring执行setter的方法 构造注入:通过<constructor-arg.../>元素驱动Spring执行带有参数的 ...
- sql 重复数据查询
具体代码: ); ORDER BY tcount DESC;
- Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)
Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别 ...
- 排序算法之冒泡排序的思想以及Java实现
1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...
- SAP 维护视图创建与修改
维护视图创建与修改 维护视图创建 T-CODE:SE54 维护ABAP数据字典 维护已生产的对象 注意:当维护视图修改后,需要删除已生成的对象,重新创建已生成的对象,否则无法显示,这个小窍门我花了半天 ...
- LeetCode算法题-Pascal's Triangle(Java实现)
这是悦乐书的第170次更新,第172篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第29题(顺位题号是118).给定非负整数numRows,生成Pascal三角形的第一个 ...