MVC3剃须刀与nHibernate

MVC3剃须刀与nHibernate,nhibernate,asp.net-mvc-3,razor,nunit,Nhibernate,Asp.net Mvc 3,Razor,Nunit,作为一个著名的ORM,我们决定使用asp.NETMVC3使用nHIbernate。我们通过以下方式建立了我们的项目: NHibernate存储库[包含NHibernate的映射、服务和存储库] MVC3[这是一个用户界面] 测试MVC NHibernate[这是NUnit的测试项目] 在上面,[]文本被写出来,以明确各层 一切正常,意味着映射、插入、更新和删除操作的所有单元测试都已通过。 不幸的是,当我们从mvc3应用程序执行相同的操作时,它抛出了以下错误: "An exception occu

作为一个著名的ORM,我们决定使用asp.NETMVC3使用nHIbernate。我们通过以下方式建立了我们的项目:

  • NHibernate存储库[包含NHibernate的映射、服务和存储库]
  • MVC3[这是一个用户界面]
  • 测试MVC NHibernate[这是NUnit的测试项目]
  • 在上面,[]文本被写出来,以明确各层

    一切正常,意味着映射、插入、更新和删除操作的所有单元测试都已通过。 不幸的是,当我们从mvc3应用程序执行相同的操作时,它抛出了以下错误:

    "An exception occurred during configuration of persistence layer."
    以上在测试项目中运行良好:

    using (var nhr = new NHibernateRepository())
    {
        var DeptList = nhr.GetAll<Departments>();
    }
    
    使用(var nhr=new nhibernaterepositionory())
    {
    var DeptList=nhr.GetAll();
    }
    

    以下是NHibernateRepository项目中的hibernate.cfg.xml文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  
      <session-factory>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Data Source=(local);Initial Catalog=myDatabaseName;Integrated Security=True</property>
        <property name="show_sql">true</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <property name="cache.use_query_cache">false</property>
        <property name="adonet.batch_size">100</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    
      </session-factory>
    </hibernate-configuration>
    
    
    NHibernate.Driver.SqlClientDriver
    数据源=(本地);初始目录=myDatabaseName;集成安全性=真
    真的
    NHibernate.dialogue.mssql2008dialogue
    假的
    100
    NHibernate.ByteCode.Castle.proxyFactory,NHibernate.ByteCode.Castle
    
    除此之外,该项目还拥有NHibernate所需的所有DLL

    在测试项目中,并没有特殊的配置设置,只是我们添加了存储库项目和其他程序集的引用

    MVC3应用程序项目中也保持了同样的功能

    这方面的任何帮助都是非常值得赞赏的


    关于

    我不确定这是否能解决您当前的问题,但我有一些建议。首先,在您的
    Global.asax
    或(我的首选)通过HttpModule实现每请求会话管理。下面是一个简单的例子:

    public class NHHttpModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.EndRequest += ApplicationEndRequest;
            context.BeginRequest += ApplicationBeginRequest;
        }
    
        public void ApplicationBeginRequest(object sender, EventArgs e)
        {
            CurrentSessionContext.Bind(SessionFactory.GetNewSession());
        }
    
        public void ApplicationEndRequest(object sender, EventArgs e)
        {
            var currentSession = CurrentSessionContext.Unbind(SessionFactory.GetSessionFactory());
            currentSession.Close();
            currentSession.Dispose();
        }
    
        public void Dispose()
        {
            // Do nothing
        }
    }
    
    请注意,这也会在请求管理期间绑定当前会话上下文

    此外,请确保设置了正确的会话上下文。测试可能应该使用
    线程
    上下文,但是web应用程序应该使用
    web
    上下文。我个人通过Fluent NHibernate对此进行了配置,但我相信在XML配置文件中,它会显示为:

    <property name="current_session_context_class">web</property>
    
    web
    

    同样,我通常使用FNH进行配置,因此请验证。

    Per@Michael-我通过提供以下答案来关闭此线程,我在研究过程中发现了这一点

    我们需要做两件事来妥善解决问题

  • 如果使用XML文件,我们需要将它们设置为嵌入属性中
  • 如果不使用xml文件,我们需要使
  • 要在上面进行设置,只需从solution Explorer中选择文件名,然后按F4键,或者右键单击文件名,然后单击属性链接,查看属性窗口


    感谢所有回答上述问题的人。

    @Bertrand-非常感谢将其格式化。我真的很想这么做,但没能做到。nunit和web应用程序读取配置文件的方式往往不同。请提供有关如何设置您的NHibernate配置的更多信息(它在哪个文件中,有哪些值等)。@Michael-更新了原始问题的更多细节。谢谢大家!我解决了这个问题。在我这方面有一个愚蠢的错误:(使hbm文件成为嵌入文件,并且工作正常:)如上所述,我发现并通知了解决方案,我将此问题标记为已结束。啊!!我试图将其标记为已关闭,但在关闭窗口中未找到任何有效选项。我请求主持人请关闭此问题谢谢您的回复,但在创建sessionfactory之前,我们将收到一个完整的问题和代码片段。哪一行是存储库代码中的第33行(以便我们可以确切知道错误抛出的位置)?第33行包含:config.Configure();我怀疑这与配置文件的位置有关。如果你的web应用程序中没有配置文件,它可能无法工作。如果您的存储库项目是一个类库,则需要将该配置放在web项目中。或者,您可以将其放在web.config中,如下所述:谢谢Josh-相同的配置和相同的结构适用于asp.net项目,但只适用于mvc3项目。
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  
      <session-factory>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Data Source=(local);Initial Catalog=myDatabaseName;Integrated Security=True</property>
        <property name="show_sql">true</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <property name="cache.use_query_cache">false</property>
        <property name="adonet.batch_size">100</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    
      </session-factory>
    </hibernate-configuration>
    
    public class NHHttpModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.EndRequest += ApplicationEndRequest;
            context.BeginRequest += ApplicationBeginRequest;
        }
    
        public void ApplicationBeginRequest(object sender, EventArgs e)
        {
            CurrentSessionContext.Bind(SessionFactory.GetNewSession());
        }
    
        public void ApplicationEndRequest(object sender, EventArgs e)
        {
            var currentSession = CurrentSessionContext.Unbind(SessionFactory.GetSessionFactory());
            currentSession.Close();
            currentSession.Dispose();
        }
    
        public void Dispose()
        {
            // Do nothing
        }
    }
    
    <property name="current_session_context_class">web</property>