我正在尝试使用C#MVC nHibernate构建一个网站。一切运作良好,但当我在多个浏览器中浏览我的网站时,我收到错误:
已经有一个与此Connection关联的打开DataReader,必须先关闭它。
我已将我的许多服务绑定到一个会话(ISession)。
//ContentService Bingings
Bind<IContentService>().To<ContentService>().InRequestScope();
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession()
)
.WhenInjectedInto<IContentService>()
.InSingletonScope();
//GeneralService Bindings
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession())
.WhenInjectedInto<IGeneralService>()
.InSingletonScope();
Bind<IGeneralService>()
.To<GeneralService>()
.InSingletonScope();
//CrossSellService Bindings
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession())
.WhenInjectedInto<ICrossSellService>()
.InSingletonScope();
Bind<ICrossSellService>()
.To<CrossSellService>()
.InSingletonScope();
//Details Bindings
Bind<ISession>()
.ToMethod(
context =>
context.Kernel.Get<IMasterSessionSource>()
.ExposeConfiguration()
.BuildSessionFactory()
.OpenSession())
.WhenInjectedInto<IDetailsService>()
.InRequestScope();
Bind<IDetailsService>()
.To<DetailsService>()
.InRequestScope();
他们被要求用于其他用途。例如我的DetailsService:
公共接口IDetailsService
{
//在这里覆盖;
}
public class DetailsService : IDetailsService
{
private static IContentService Context { get; set; }
public DetailsService(IContentService context)
{
Context = context;
}
...
其中IContentService是我的主要Query类:
public interface IContentService
{
IQueryable<Source> Sources { get; }
}
public class ContentService : IContentService
{
private readonly ISession _session;
public ContentService(ISession session)
{
_session = session;
}
public IQueryable<Source> Sources
{
get { return _session.Query<Source>(); }
}
不确定为什么它不能访问多个查询
答案 0 :(得分:2)
这听起来很随机,但我的同事在我们支持的应用程序中遇到了类似的问题。他说这个问题与使用Singleton有关。 通过改变为瞬态来修复它。
答案 1 :(得分:2)
看起来这种情况发生的原因是因为您试图在不同的线程中使用相同的ISession。它之所以这样做是因为:
Bind<ISession>()
...
.InSingletonScope();
您的会话不应该是网络环境中的单身人士。我建议使用nhibernate上下文会话。
Why does Nhibernate share the session across multiple requests in my MVC application?