NHibernate-调用Init后无法设置ConfigurationCache属性

NHibernate-调用Init后无法设置ConfigurationCache属性,nhibernate,asp.net-mvc-3,s#arp-architecture,Nhibernate,Asp.net Mvc 3,S#arp Architecture,在我的S#arp Arch 2.0项目中,我正在与两个数据库通信。这在ASP.NETDevelopmentServer(VS2010)本地运行良好,并通过了需要与任一数据库对话的单元测试 下一步是将项目发布(使用VS内置的“发布”菜单选项)到内部开发服务器(WindowsServer2008R2)上,并在人们可以看到的真实服务器上启动该项目 现在,当我尝试运行应用程序时,我得到了标题中显示的异常。在下面的=new NHibernateConfigurationFileCache()行引发异常:

在我的S#arp Arch 2.0项目中,我正在与两个数据库通信。这在ASP.NETDevelopmentServer(VS2010)本地运行良好,并通过了需要与任一数据库对话的单元测试

下一步是将项目发布(使用VS内置的“发布”菜单选项)到内部开发服务器(WindowsServer2008R2)上,并在人们可以看到的真实服务器上启动该项目

现在,当我尝试运行应用程序时,我得到了标题中显示的异常。在下面的=new NHibernateConfigurationFileCache()行引发异常:

private void InitialiseNHibernateSessions()
    {
        NHibernateSession.ConfigurationCache = new NHibernateConfigurationFileCache();

        NHibernateSession.InitStorage(this.webSessionStorage);

        NHibernateSession.AddConfiguration(NHibernateSession.DefaultFactoryKey,
            new[] { Server.MapPath("~/bin/SRN2.Infrastructure.dll") },
            new AutoPersistenceModelGenerator().Generate(),
            Server.MapPath("~/NHibernate.config"),
            null, null, null);


        NHibernateSession.AddConfiguration(SRN2.Infrastructure.DataGlobals.OTHER_DB_FACTORY_KEY,
            new string[] { Server.MapPath("~/bin/SRN2.Infrastructure.dll") },
            new AutoPersistenceModelGenerator().Generate(),
            Server.MapPath("~/NHibernate-OTHER.config"),
            null, null, null);

    }
堆栈跟踪:

[InvalidOperationException: Cannot set the ConfigurationCache property after calling Init]
   SharpArch.NHibernate.NHibernateSession.set_ConfigurationCache(INHibernateConfigurationCache value) +105
   SRN2.Web.Mvc.MvcApplication.InitialiseNHibernateSessions() in C:\code\SRN2-Sharp2\trunk\Solutions\SRN2.Web.Mvc\Global.asax.cs:122
   SharpArch.NHibernate.NHibernateInitializer.InitializeNHibernateOnce(Action initMethod) +116
   SRN2.Web.Mvc.MvcApplication.Application_BeginRequest(Object sender, EventArgs e) in     C:\code\SRN2-Sharp2\trunk\Solutions\SRN2.Web.Mvc\Global.asax.cs:71
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

Jon是对的,听起来你的InitialiseNHibernateSessions方法被多次调用。您不必使用配置缓存,您是否尝试过禁用它

NHibernate配置缓存到文件中,以缩短启动时间。如果配置未更改,则从缓存文件加载。缓存文件的默认位置是系统临时文件夹(例如Path.GetTempPath())

如果您没有文件权限,或者不需要配置缓存,只需删除或注释掉初始化配置缓存的行,即此行:

NHibernateSession.ConfigurationCache = new NHibernateConfigurationFileCache();

对于一个应用程序,在一段较长的时间内,大约每个月或两个月都会发生此错误。我还没有真正能够永久修复此问题,但我确实发现以下过程解决了以下问题的错误:

  • 删除临时配置缓存文件;它们应该位于Windows临时文件文件夹中,每个数据库都应该有一个文件(例如DatabaseName--1973822310.bin)和另一个名为nhibernate.current \-u session--1973822310.bin的文件
  • 重新启动应用程序的IIS网站
  • 为应用程序回收应用程序池

  • 看看这是否有帮助:我看不出这有什么不同,除了用try/catch包装它,catch只是抛出异常,所以这不会解决任何问题……不确定答案,但看起来您的InitialiseNHibernateSessions方法被多次调用。我建议第一步是让站点在您的开发环境中的IIS或IIS Express下运行,并重现错误-ASP.NET开发服务器与IIS有“许多架构差异”(Microsoft的话),因此您不能依赖于获得与在生产环境中相同的行为。试着让一个本地复制程序工作,看看能给你什么线索-然后让我们知道:-)我在本地没有管理权限(讽刺的是,我应该在虚拟机上有更多权限,但我不制定策略),所以在本地IIS下运行会很困难。还有其他建议吗?我可以花4个小时设置一个虚拟机来运行IIS,然后用这种方式进行尝试,但是如果还有什么我可以先尝试的话,我更倾向于这样做。我想这只会对性能造成轻微影响,而且只有在应用程序池被回收的情况下?我将查看是否能够找出它试图使用的路径,并查看INET_USR是否对其具有不正确的权限。