首页 新闻 会员 周边 捐助

EntityFramework6如何连接多个数据库(会员库、业务库、日志库)

1
悬赏园豆:30 [已解决问题] 解决于 2017-12-18 10:52

有这样一个需求:需要将之前的一个数据库拆分成多个业务库

分成会员库,日志库,机票业务、旅游业务等

现在使用的是单例模式,通过每次查询或新增数据,传入对应的conn,去创建context.

if (context == null)
{
context = new DBContextEntities(whereDb);
CallContext.SetData("DbContext", context);
oldDb = whereDb;
}
else if (oldDb == whereDb)
{

}
else
{
context = new DBContextEntities(whereDb);
CallContext.SetData("DbContext", context);
oldDb = whereDb;
}

//

结果就有问题了,比如一个用户在执行批量插入操作。先foreach追加到上下文

db.Set<T>().Add(entity); 然后db.savechanges保存

如果同时有其他用户在访问网站,就会导致savechanges已经提交。

批量操作的用户虽然方法提示成功,但是insert into的数量不对。

代码小六的主页 代码小六 | 初学一级 | 园豆:12
提问于:2017-10-16 13:58
< >
分享
最佳答案
0

多个上下文

收获园豆:30
吴瑞祥 | 高人七级 |园豆:29449 | 2017-10-16 14:17

多上下文是可以的,总感觉不是太好。

代码小六 | 园豆:12 (初学一级) | 2017-10-25 10:04
其他回答(4)
0

既然采用了单例模式为什么会insert into的数量不对呢?不是每次都能保证savechanges的时候只有一个数据上下文吗

猝不及防 | 园豆:2878 (老鸟四级) | 2017-10-16 15:21
0

我猜只是context 做了单例,应该也没用IOC之类的吧,简单粗暴去掉单例,每次new context搞定。

找不到一个满意的昵称 | 园豆:243 (菜鸟二级) | 2017-10-17 15:38

是的  没有使用

支持(0) 反对(0) 代码小六 | 园豆:12 (初学一级) | 2017-10-25 10:01
0

这是肯定的,,你应该避免foreach追加到上下文,,因为如果在你本次savechange之前就有其他操作进行了 savechange就已经直接保存到数据库中了,所以需要foreach数据比较多比较耗时的话,可以先append到内存中最后进行 添加到context再进行savechange ,ef底层也是ado.net 如果ado.net开启了连接池,就算你每次都进行new 其实耗性能不太大的

Kerwin1202 | 园豆:68 (初学一级) | 2017-10-17 16:37

你说的append到内存和我上面写的.add(entity)是一样的吧 ,就是追加到内存,然后最后savechanges保存的,主要是多个数据库链接,导致了,对第一个数据库的操作没有完成,已经对第二个数据库进行操作,导致第一个提交了一部分

支持(0) 反对(0) 代码小六 | 园豆:12 (初学一级) | 2017-10-25 10:04

@代码小六: 我不知道你的.add(entity)整个add过程用的是多久时长是秒内还是分分钟,,如果是秒内,,确实没什么太大区别,,但是你可以试试线add到内存,,再addrange整个列表 再进行savechange(这个我没试过,,只是提个建议)

支持(0) 反对(0) Kerwin1202 | 园豆:68 (初学一级) | 2017-10-25 10:08
0

既然数据拆分了,为什么业务系统不拆分,做成多个微型服务不是更加好?

追随微笑 | 园豆:227 (菜鸟二级) | 2017-12-18 11:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册