我可以分享下我的做法
每个库一个dal 每个项目的bll可以引用多个dal 那么单表查询问题就解决了
然后bll层通过一个类聚合
public class UnitOfWorkCrmData { private static object lockobj = new object(); #region GLRISCRM_PassportContext GLRISCRM_PassportContext _GLRISCRM_PassportContext = null; public GLRISCRM_PassportContext GLRISCRM_PassportContext { get { if (_GLRISCRM_PassportContext == null) { lock (lockobj) { if (_GLRISCRM_PassportContext == null) { _GLRISCRM_PassportContext = new GLRISCRM_PassportContext(); } } } return _GLRISCRM_PassportContext; } } UserRepository _UserRepository = null; public UserRepository UserRepository { get { if (_UserRepository == null) { lock (lockobj) { if (_UserRepository == null) { _UserRepository = new UserRepository(GLRISCRM_PassportContext); } } } return _UserRepository; } } #endregion #region GLRISCRM_PlatformContext GLRISCRM_PlatformContext _GLRISCRM_PlatformContext = null; public DbContext GLRISCRM_PlatformContext { get { if (_GLRISCRM_PlatformContext == null) { lock (lockobj) { if (_GLRISCRM_PlatformContext == null) { _GLRISCRM_PlatformContext = new GLRISCRM_PlatformContext(); } } } return _GLRISCRM_PlatformContext; } } AreaRepository _AreaRepository = null; public AreaRepository AreaRepository { get { if (_AreaRepository == null) { lock (lockobj) { if (_AreaRepository == null) { _AreaRepository = new AreaRepository(GLRISCRM_PlatformContext); } } } return _AreaRepository; } } #endregion #region GLRISCRMContext GLRISCRM.Dal.GLRISCRMContext _GLRISCRMContext = null; public DbContext GLRISCRMContext { get { if (_GLRISCRMContext == null) { lock (lockobj) { if (_GLRISCRMContext == null) { _GLRISCRMContext = GLRISCRM.Dal.GLRISCRMContext.CreatContext(); } } } return _GLRISCRMContext; } } AnnouncementMsgRepository _AnnouncementMsgRepository; public AnnouncementMsgRepository AnnouncementMsgRepository { get { if (_AnnouncementMsgRepository == null) { lock (lockobj) { if (_AnnouncementMsgRepository == null) { _AnnouncementMsgRepository = new AnnouncementMsgRepository(GLRISCRMContext); } } } return _AnnouncementMsgRepository; } } #endregion bool _IsCommit = true; public bool IsCommit { get { return _IsCommit; } set { _IsCommit = value; } } public void Commit() { if (IsCommit) { GLRISCRM_PlatformContext.SaveChanges(); GLRISCRMContext.SaveChanges(); GLRISCRM_PassportContext.SaveChanges(); } } }
提交的位置 提供一个commit方法 将其嵌入到 endrequest中
那么保存的位置解决了
然后就是跨库查询
跨库查询通过 sql语句解决
[库名].[框架名].[表名]
哥们 谢谢你 。但是我用的是codefirst 我的意思是想 一个库那样用lambda表达式查询,通过对象的导航属性 自动关联相关的数据,不必写sql
"就是我有300个实体类 对应300个表 我总部能把他弄成一个数据库"
这是WHO TELL YOU?
单个库会太大啊 存储过程太多 等 我怕影响性能 ,我是这样想的 ,难道所有用codefirst的人都用一个库吗
@keeppuching:
这么说吧,你的提问类似于以下这样的提问,
请问10万元可以做一个微信吗?
1、不是所有用codefirst的人都用一个库,也有好多访问可以用多个库。
2、单个库会太大?你的数据有多少个EB?存储过程太多?几十万个?我在金蝶还是哪个ERP里面看到2千多个存储过程。
3、分库就不能用inner join这类方法,分库通常是将不关联的分开,而不是因为数据量大而分开,如果是数据量大,通常采用的是分区或者读写分离。
4、你问问题的方式,就是让我感觉你现在刚刚在学写软件,就担忧要是哪天我这个软件要给1千万人使用咋办?如果马云看上我了怎么办?给个建议,就是如果你这个软件不到10万预算,这些都不是你要考虑的。
如果预算超过10万,这些也不是你要考虑的,要么你们老板找错人了。应该是换人懂的来考虑。
5、分库、分区、读写分离都是好方法,但不是给预算不足的公司用的。
@爱编程的大叔: 我确实没架构过。而且经验欠缺 ,没有自己设计过一个框架。
而且我觉得ef和t4结合 可以大幅减少代码量。
我们现有多个库 标数量比较大。
代码比较懒懒,我想私下改造一下,改造成功推荐给公司。失败就算了
但是真不知道 必须多个库 单个库 有什么不好 这个还真步知道 ,
我是想着不好 ,首先单个库表太多 找都步好找
我以为ef 有针对多库的 导航查询 所以才来问
另外我觉得拿1000的薪水 干1万薪水的活 并步吃亏
@keeppuching:
另外我觉得拿1000的薪水 干1万薪水的活 并步吃亏 。
这句话我是赞同的。
但是你问问题的方式就不对了。你直接说你就是要多库,这个是限制条件,不可修改就好了。
现在变成大家在奇怪你为什么没事吃饱了撑着去多库。
我的意思无非是你如果做一个小项目,却非要用大数据(据说现在很流行),那就是吃饱了撑着。
大项目与小项目从一开始就是完全不同的做法。
如果你愿意,每个数据库100M,却分成18个数据库来操作,也没有人会责怪你的。
所有人回答问题或者提问,都会希望有个数量级上的判断,来更好地判断该如何使用技术,使用什么技术。
如果你们公司的年营业额就1000万,正常利润100万来说,然后我建议你们上SAP的ERP,你会不会觉得我疯了。
跨不了。