首页 新闻 会员 周边 捐助

请问ef codefirst如何跨库查询

0
[已解决问题] 解决于 2014-10-30 22:45

就是我有300个实体类 对应300个表 我总部能把他弄成一个数据库把
我想把 他们分开 到 几个数据库中,应该怎么弄,
以及 他们之间关联关系 是怎么 的 比如说导航属性。那么查询的时候 如果是跨库的两个实体 怎么关联关系 就是运用导航属性

keeppuching的主页 keeppuching | 初学一级 | 园豆:6
提问于:2014-07-03 11:12
< >
分享
最佳答案
0

我可以分享下我的做法 

每个库一个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语句解决

[库名].[框架名].[表名]

 

 

 

奖励园豆:5
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2014-07-04 14:15

哥们 谢谢你 。但是我用的是codefirst 我的意思是想 一个库那样用lambda表达式查询,通过对象的导航属性 自动关联相关的数据,不必写sql

keeppuching | 园豆:6 (初学一级) | 2014-07-04 15:45
其他回答(2)
0

"就是我有300个实体类 对应300个表 我总部能把他弄成一个数据库"

这是WHO TELL YOU?

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-07-03 11:19

单个库会太大啊  存储过程太多 等 我怕影响性能 ,我是这样想的 ,难道所有用codefirst的人都用一个库吗

支持(0) 反对(0) keeppuching | 园豆:6 (初学一级) | 2014-07-04 15:41

@keeppuching: 

这么说吧,你的提问类似于以下这样的提问,

请问10万元可以做一个微信吗?

1、不是所有用codefirst的人都用一个库,也有好多访问可以用多个库。

2、单个库会太大?你的数据有多少个EB?存储过程太多?几十万个?我在金蝶还是哪个ERP里面看到2千多个存储过程。

3、分库就不能用inner join这类方法,分库通常是将不关联的分开,而不是因为数据量大而分开,如果是数据量大,通常采用的是分区或者读写分离。

4、你问问题的方式,就是让我感觉你现在刚刚在学写软件,就担忧要是哪天我这个软件要给1千万人使用咋办?如果马云看上我了怎么办?给个建议,就是如果你这个软件不到10万预算,这些都不是你要考虑的。

如果预算超过10万,这些也不是你要考虑的,要么你们老板找错人了。应该是换人懂的来考虑。

5、分库、分区、读写分离都是好方法,但不是给预算不足的公司用的。

支持(1) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-07-04 15:57

@爱编程的大叔: 我确实没架构过。而且经验欠缺  ,没有自己设计过一个框架。

而且我觉得ef和t4结合 可以大幅减少代码量。

我们现有多个库  标数量比较大。

代码比较懒懒,我想私下改造一下,改造成功推荐给公司。失败就算了

但是真不知道  必须多个库  单个库 有什么不好  这个还真步知道 ,

我是想着不好 ,首先单个库表太多 找都步好找

我以为ef 有针对多库的 导航查询  所以才来问

另外我觉得拿1000的薪水 干1万薪水的活 并步吃亏  

支持(0) 反对(0) keeppuching | 园豆:6 (初学一级) | 2014-07-07 09:20

@keeppuching: 

另外我觉得拿1000的薪水 干1万薪水的活 并步吃亏 。

这句话我是赞同的。

但是你问问题的方式就不对了。你直接说你就是要多库,这个是限制条件,不可修改就好了。

现在变成大家在奇怪你为什么没事吃饱了撑着去多库。

我的意思无非是你如果做一个小项目,却非要用大数据(据说现在很流行),那就是吃饱了撑着。

大项目与小项目从一开始就是完全不同的做法。

如果你愿意,每个数据库100M,却分成18个数据库来操作,也没有人会责怪你的。

所有人回答问题或者提问,都会希望有个数量级上的判断,来更好地判断该如何使用技术,使用什么技术。

如果你们公司的年营业额就1000万,正常利润100万来说,然后我建议你们上SAP的ERP,你会不会觉得我疯了。

支持(0) 反对(1) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-07-07 10:14
0

跨不了。

Launcher | 园豆:45050 (高人七级) | 2014-07-03 13:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册