EF连接数据库经常出现当前连接状态为打开

toploveall 2015-07-23 04:37:03
网站使用技术是asp.net mvc + EF
过两天网站就报错,错误日志记录:
执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.InvalidOperationException: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。
网上去查都是ado.net的答案:if(Connection.Sate==Connection.Open){conn.Close();} 之类的答案
请问在EF中怎去关闭连接
网站首页查询组成:
1、连接一张表查询
2、连接五张表查询(左连接)
3、连接一张表查询
4、连接一张表查询
5、连接一张表查询
五个查询都是用的Linq查询,延迟加载,请问如何在EF中控制数据库的打开和关闭,EF是用连接池的方式去创建连接吗?
请指点,谢谢。
...全文
617 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
种草德鲁伊 2015-07-29
  • 打赏
  • 举报
回复
引用 12 楼 moonwrite 的回复:
但一般新手不知道tolist会产生一个怎么样的行为
为什么不知道?完全是你猜的 是不是导航属性的问题,等楼主测试,原因是对IQueryable迭代同时使用导航属性需要同时使用两个datareader,楼主碰到的是不是这个问题我不确定
toploveall 2015-07-29
  • 打赏
  • 举报
回复
现在思路: 1、不使用单例模式,把所有的private 类名 改为 public 类名 2、工厂方法中,把创建对象的方法,改为 new 的形式创建对象 BLL和DAL层都要改,这样应该可以了吧。 请指点
toploveall 2015-07-29
  • 打赏
  • 举报
回复



如果要改成不使用单例模式,工厂模式可以保留吧
moonwrite 2015-07-29
  • 打赏
  • 举报
回复
看不到工厂~ 单例模式也用得不是很正统~ Repository也用得~~~~ 可以参考一下:nopCommerce
toploveall 2015-07-29
  • 打赏
  • 举报
回复
我碰到的问题应该和6楼的解释有关
BLL层和DAL层全是单例+工厂模式



moonwrite 2015-07-28
  • 打赏
  • 举报
回复
引用 9 楼 toploveall 的回复:
[quote=引用 6 楼 moonwrite 的回复:] 5楼,不要随便教别人ToList 只是说抛出内存,日志应该有说到那个代码段抛出的吧~ 只要你的EF不用单例模式,也不用静态变量引用着就好~ 最后,既然是首页,能缓存的数据,尽量缓存起来
现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。[/quote] 你的bll会让dal也不会释放么? 如果是 因为EF有自己的缓存策略~~~ 在EF单例模式下,你的增删改查都在EF的内存中~ 不是实时到数据库 https://msdn.microsoft.com/zh-cn/library/gg696418 而且你查询的数据都会缓存到EF中....
moonwrite 2015-07-28
  • 打赏
  • 举报
回复
引用 11 楼 KarasCanvas 的回复:
[quote=引用 6 楼 moonwrite 的回复:] 5楼,不要随便教别人ToList 只是说抛出内存,日志应该有说到那个代码段抛出的吧~ 只要你的EF不用单例模式,也不用静态变量引用着就好~ 最后,既然是首页,能缓存的数据,尽量缓存起来
ToList会有什么问题?[/quote] 大多是因为在对 IQueryable迭代的时候用导航属性,解决方法是先将 IQueryable转换为List 你想说通过Tolist把数据拿到内存中再foreach什么的~~~从而来减少对数据库的查询 我明白你的意思 但一般新手不知道tolist会产生一个怎么样的行为 另外就是他在IQueryable foreach会造成这个异常么
种草德鲁伊 2015-07-28
  • 打赏
  • 举报
回复
引用 6 楼 moonwrite 的回复:
5楼,不要随便教别人ToList 只是说抛出内存,日志应该有说到那个代码段抛出的吧~ 只要你的EF不用单例模式,也不用静态变量引用着就好~ 最后,既然是首页,能缓存的数据,尽量缓存起来
ToList会有什么问题?
toploveall 2015-07-27
  • 打赏
  • 举报
回复
引用 6 楼 moonwrite 的回复:
5楼,不要随便教别人ToList 只是说抛出内存,日志应该有说到那个代码段抛出的吧~ 只要你的EF不用单例模式,也不用静态变量引用着就好~ 最后,既然是首页,能缓存的数据,尽量缓存起来
现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。
  • 打赏
  • 举报
回复
观察bug问题,设计测试用例,然后确保可以重现问题,这本身确实需要技术水平的。如果你只是“编写代码”,而懒得设计测试用例,那么我只能说“无能为力”,你还是需要请别人替你负责解决bug。
  • 打赏
  • 举报
回复
引用 3 楼 toploveall 的回复:
[quote=引用 2 楼 sp1234 的回复:] 贴bug调试画面,给出具体的代码、和你的初步调试。
这个问题只有在线上运行时才会出现,调试是调不出bug的。 每隔三四天就会出现这样的问题,不过内容就是: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.InvalidOperationException: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。[/quote] 那是因为你没有花必要的精力在测试时去重现bug,不是“调试时调不出bug”。 最起码地,你应该贴出具体的画面说明“到底是哪一行代码抛出的异常”。否则你的bug报告很不到位,仅仅让别人去纠结理论是非,往往产生比不要的争议。
moonwrite 2015-07-27
  • 打赏
  • 举报
回复
5楼,不要随便教别人ToList 只是说抛出内存,日志应该有说到那个代码段抛出的吧~ 只要你的EF不用单例模式,也不用静态变量引用着就好~ 最后,既然是首页,能缓存的数据,尽量缓存起来
种草德鲁伊 2015-07-27
  • 打赏
  • 举报
回复
大多是因为在对 IQueryable迭代的时候用导航属性,解决方法是先将 IQueryable转换为List
toploveall 2015-07-27
  • 打赏
  • 举报
回复
还请过路的高手指点一二
toploveall 2015-07-27
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
贴bug调试画面,给出具体的代码、和你的初步调试。
这个问题只有在线上运行时才会出现,调试是调不出bug的。 每隔三四天就会出现这样的问题,不过内容就是: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.InvalidOperationException: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。
  • 打赏
  • 举报
回复
贴bug调试画面,给出具体的代码、和你的初步调试。
编程有钱人了 2015-07-23
  • 打赏
  • 举报
回复
EF 不用关闭吧,反正我写的时候没关闭,内部应该自动释放的 如果非要写,应该这么写

using (Entities entities = new Entities())
{
var query = from c in entities.Customers
where c.Address.City == city
select c;
foreach (Customers c in query)
 Console.WriteLine(c.CompanyName);
}
类似这么写

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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