[求教]EF应该如何建立数据库连接,不同方法如何共用一个数据库连接?

yixian2007 2016-01-06 05:15:47
试了几种方法了,实际测试的效果都不太好。

比如这样的,我写了几个方法,方法A从表A中获得列表,方法B从表B中获得列表。其中A中New了一个数据库连接,B中也New了一个连接,结果方法A和方法B再次用EF连接的时候,可以看到服务器方的SQL语句是一条条执行的,就是将A中的数据给B中一条条执行,速度非常慢,而不是A表和B表直接连接获得结果。。。。。

请问,如果我有多个方法,怎么能共享一个数据库连接?
...全文
580 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2016-02-04
  • 打赏
  • 举报
回复
貌似你这个问题都问了好几年了 我们也回答了好几年了,如果你想公用大可以 xxxxxmethod(context=null) 加一个可空参数,context为空自己new一个,context不为空就用传进来的,这样其实也有好处,就是如果是事件也能统一处理了 ps:博客园所谓的仓储模式,仓储了5年终于也发现有问题了,所以嘛有接着搞了一个工作单元模式 还分了一个实体根,聚合根,你现在的东西其实就是他们那边所谓的工作单元模式 实体根/聚合根,不过对于我个人来说除了仓储事件总线还有点意义以外,其他的完全无所谓,我一个可空参数就行了
wanghui0380 2016-02-04
  • 打赏
  • 举报
回复
额,这个EF没关系,EF本来就是一条一条执行地。 批量有批量的搞法,
正怒月神 2016-02-04
  • 打赏
  • 举报
回复
不太明白这个描述。 什么叫A中New了一个数据库连接??? EF貌似不需要你开启数据库连接,他自己会管理啊= =
yixian2007 2016-01-07
  • 打赏
  • 举报
回复
我试试用ILIST类型取数据,然后本地对比试试吧。
yixian2007 2016-01-07
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
那你就按我上面写的分别组织查询吧 然后这是n+1说明
我觉得我这个问题和N+1不搭边啊。 因为我现在的问题是由于对不同表的操作被封装到不同的对象中,而连接是两个上下文,造成没办法用一个上下文来优化SQL语句的问题。
  • 打赏
  • 举报
回复
那你就按我上面写的分别组织查询吧 然后这是n+1说明
yixian2007 2016-01-07
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
你A和B返回IQueryable试试,不要直接返回List之类的
提示错误,指定的表达式包含对不同上下文关联的查询的引用,估计是因为两个New的ObjectContext的问题,因为NEW了两个,相当于两个数据库了。。。
  • 打赏
  • 举报
回复
你A和B返回IQueryable试试,不要直接返回List之类的
yixian2007 2016-01-07
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这是N+1问题,不是EF问题 你可以将A集合的关键信息比如主键集合取到,然后作为参数传递给B,进行一次查询 简单的说就是尽可能的减少N+1
不是很明白,你说的N+1是什么意思?百度了一下没什么解释。 另外,你说用参数传?怎么传?我本来就是要两个联合得到一个数据集的,怎么传参数? 举个例子吧,我现在的问题是这样的。 一个方法A,获得一个学期所有教学任务的列表,这个方法A在其它地方有用,我是这样写的 TeachEasEntities db = new TeachEasEntities() return db.任务表.Where(条件); 一个方法B,获得某个时间段的教学安排,这个方法B在其它地方也有用到,我是这样写的 TeachEasEntities db = new TeachEasEntities() return db.教学安排表.Where(条件); 然后我开始相联合这两个方法 var query = from s in A from r in B where 条件 select s; 结果,在数据库端检测到1万多条查询语句。。。。。。 但实际上,如果这样写 TeachEasEntities db = new TeachEasEntities() var query = from s in db.任务表.Where(条件) from r in db.教学安排表.Where(条件) where 条件 select s; 数据库端只有一条SQL语句。 我个人分析,可能是因为TeachEasEntities db = new TeachEasEntities()了之后,到函数结事,与数据库的连接是断开的,两次NEW的算两个实体集,所以没有办法连接,有没有什么办法解决这个问题?虽然我可以用后面的方法来写,但这样函数的复用性就不好了。
  • 打赏
  • 举报
回复
这是N+1问题,不是EF问题 你可以将A集合的关键信息比如主键集合取到,然后作为参数传递给B,进行一次查询 简单的说就是尽可能的减少N+1

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧