我已经在我的MVC C#应用程序中使用NInject MVC5实现了NHibernate。一切正常,但是我意识到当我双击链接时总是会收到错误:{“已经有一个与此连接相关联的打开的DataReader,必须先关闭它。”}
或者
{“会话关闭!\ r \ n对象名称:'ISession'。”}
现在我知道这是因为我将IContentService接口绑定到ISession。我也知道ISession不是线程安全的,只能使用一次。所以我的问题是...那我应该如何创建一个可以在多个线程中同时使用InRequestScope的会话。因为我知道用户会双击或用户会同时单击一个链接,而另一个用户正在单击相同的链接,所以停止多个用户的错误并不是很理想。
我在注射中有这个:
Bind<IContentService>().To<ContentService>().InRequestScope();
Bind<ISession>() //I'm sure the problem is right here, but not sure.
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>().GetSession())
.WhenInjectedInto<IContentService>()
.InRequestScope();
我的ContentService
public interface IContentService
{
IQueryable<Question> Questions{ get; }
}
public class ContentService : IContentService
{
private readonly ISession _session; //I think the problem might be here too...
public ContentService(ISession session)
{
_session = session;
}
public IQueryable<Question> Questions
{
get { return _session.Query<Question>(); }
}
}
更新
我读了我应该如何使用ISessionFactory进行多线程处理,但是我无法像ISession那样绑定它。
原来我在每个请求的会话中正确地进行了多线程。问题是NHibernate的一个主要问题是MySQL太早关闭了会话。感谢您的回应。这绝对是一个很难解释的问题。
更新
在这里找出答案:会话已关闭对象名称:'ISession'。在NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed()-如何阻止会话过早关闭
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句