C# MySql、Ninject和NHibernate—已经有一个与此连接关联的开放数据读取器,必须先关闭它
我使用的是一个MySQL数据库,我使用Fluent NHibernate访问该数据库,并使用Ninject连接每个请求的会话,如下所示:C# MySql、Ninject和NHibernate—已经有一个与此连接关联的开放数据读取器,必须先关闭它,c#,mysql,nhibernate,ninject,C#,Mysql,Nhibernate,Ninject,我使用的是一个MySQL数据库,我使用Fluent NHibernate访问该数据库,并使用Ninject连接每个请求的会话,如下所示: Kernel.Bind<ISession>() .ToMethod(context => Kernel.Get<ISessionFactory>().OpenSession()) .InRequestScope(); Kernel.Bind() .ToMethod(
Kernel.Bind<ISession>()
.ToMethod(context => Kernel.Get<ISessionFactory>().OpenSession())
.InRequestScope();
Kernel.Bind()
.ToMethod(上下文=>Kernel.Get().OpenSession())
.InRequestScope();
我确实有OnDeactivation(x=>x.Dispose())代码>但已被告知不需要,因为Ninject将为您调用Dispose
一切都很好,除了有几次我双击一个链接,导致读到“已经有一个打开的DataReader与此连接关联,必须先关闭。”
我读到我需要启用多个活动记录集(MARS),但我认为MySQL不支持这一点
我能做些什么来消除这个错误吗?这是因为通过Parrell.ForEach在多个线程中使用了NHibernate
因此,基本上不要在多个线程中使用单个会话 你的工厂是如何建立起来的?您使用的是事务吗?不,我使用的是一个通用存储库,其中每个方法中都有一个事务。如何在整个请求中使用事务?ISessionFactory
的绑定在哪里?另外,您是否验证了在显式打开和关闭会话时不会发生此错误?很可能这实际上与Ninject无关,并且代码的某些部分没有正确考虑NHibernate的惰性计算。首先,我要查找任何线程、异步任务、异步页面或可能比会话寿命长的对象(例如存储在会话或缓存中)。