问题描述
网站使用技术是asp.netmvc+EF过两天网站就报错,错误日志记录:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。网上去查都是ado.net的答案:if(Connection.Sate==Connection.Open){conn.Close();}之类的答案请问在EF中怎去关闭连接网站首页查询组成:1、连接一张表查询2、连接五张表查询(左连接)3、连接一张表查询4、连接一张表查询5、连接一张表查询五个查询都是用的Linq查询,延迟加载,请问如何在EF中控制数据库的打开和关闭,EF是用连接池的方式去创建连接吗?请指点,谢谢。
解决方案
解决方案二:
EF不用关闭吧,反正我写的时候没关闭,内部应该自动释放的如果非要写,应该这么写using(Entitiesentities=newEntities()){varquery=fromcinentities.Customerswherec.Address.City==cityselectc;foreach(Customerscinquery)Console.WriteLine(c.CompanyName);}
类似这么写
解决方案三:
贴bug调试画面,给出具体的代码、和你的初步调试。
解决方案四:
引用2楼sp1234的回复:
贴bug调试画面,给出具体的代码、和你的初步调试。
这个问题只有在线上运行时才会出现,调试是调不出bug的。每隔三四天就会出现这样的问题,不过内容就是:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。
解决方案五:
还请过路的高手指点一二
解决方案六:
大多是因为在对IQueryable迭代的时候用导航属性,解决方法是先将IQueryable转换为List
解决方案七:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来
解决方案八:
引用3楼toploveall的回复:
Quote: 引用2楼sp1234的回复:
贴bug调试画面,给出具体的代码、和你的初步调试。这个问题只有在线上运行时才会出现,调试是调不出bug的。每隔三四天就会出现这样的问题,不过内容就是:执行命令定义时出错。有关详细信息,请参阅内部异常。--->System.InvalidOperationException:ExecuteReader要求已打开且可用的Connection。连接的当前状态为打开。
那是因为你没有花必要的精力在测试时去重现bug,不是“调试时调不出bug”。最起码地,你应该贴出具体的画面说明“到底是哪一行代码抛出的异常”。否则你的bug报告很不到位,仅仅让别人去纠结理论是非,往往产生比不要的争议。
解决方案九:
观察bug问题,设计测试用例,然后确保可以重现问题,这本身确实需要技术水平的。如果你只是“编写代码”,而懒得设计测试用例,那么我只能说“无能为力”,你还是需要请别人替你负责解决bug。
解决方案十:
引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来
现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。
解决方案十一:
引用9楼toploveall的回复:
Quote: 引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来现在的代码在BLL层全是用的单例模式,不明白为什么单例会出错。
你的bll会让dal也不会释放么?如果是因为EF有自己的缓存策略~~~在EF单例模式下,你的增删改查都在EF的内存中~不是实时到数据库https://msdn.microsoft.com/zh-cn/library/gg696418而且你查询的数据都会缓存到EF中....
解决方案十二:
引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来
ToList会有什么问题?
解决方案十三:
引用11楼KarasCanvas的回复:
Quote: 引用6楼moonwrite的回复:
5楼,不要随便教别人ToList只是说抛出内存,日志应该有说到那个代码段抛出的吧~只要你的EF不用单例模式,也不用静态变量引用着就好~最后,既然是首页,能缓存的数据,尽量缓存起来ToList会有什么问题?
大多是因为在对IQueryable迭代的时候用导航属性,解决方法是先将IQueryable转换为List你想说通过Tolist把数据拿到内存中再foreach什么的~~~从而来减少对数据库的查询我明白你的意思但一般新手不知道tolist会产生一个怎么样的行为另外就是他在IQueryableforeach会造成这个异常么
解决方案十四:
解决方案十五:
引用12楼moonwrite的回复:
但一般新手不知道tolist会产生一个怎么样的行为
为什么不知道?完全是你猜的是不是导航属性的问题,等楼主测试,原因是对IQueryable迭代同时使用导航属性需要同时使用两个datareader,楼主碰到的是不是这个问题我不确定
解决方案:
我碰到的问题应该和6楼的解释有关BLL层和DAL层全是单例+工厂模式
解决方案:
看不到工厂~单例模式也用得不是很正统~Repository也用得~~~~可以参考一下:nopCommerce
解决方案:
如果要改成不使用单例模式,工厂模式可以保留吧
解决方案:
现在思路:1、不使用单例模式,把所有的private类名改为public类名2、工厂方法中,把创建对象的方法,改为new的形式创建对象BLL和DAL层都要改,这样应该可以了吧。请指点