【发布时间】:2016-11-30 19:56:46
【问题描述】:
我已经在我的 MVC C# 应用程序中使用 NInject MVC5 实现了 NHibernate。一切正常,但我意识到当我双击我的链接时,我总是得到错误: {"已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。"}
或
{"会话已关闭!\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();
我的内容服务
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 那样绑定它。
【问题讨论】:
-
你已经在your prior question 中被告知 NHibernate 会话不是线程安全的(你承认在这里和当时也知道)。一遍又一遍地问同样的问题不会改变宇宙
-
基于此:stackoverflow.com/questions/7359909/…“会话工厂是线程安全的,会话不是。”但问题与上一个问题不同的是,我问如何进行多线程会话
-
天哪,那个链接有什么关系?你认为不同的问题会导致不同的结果吗? “Sessions are not thread safe in NHibernate by design”。接受它并泡一杯好茶
-
所以你告诉我这是一个失败的原因。 NHibernate 不能同时进行两个会话?
标签: c# mysql nhibernate ninject ninject.web.mvc