【问题标题】:MVC3 Razor with nHibernate带有 nHibernate 的 MVC3 Razor
【发布时间】:2011-08-27 09:40:51
【问题描述】:

作为著名的 ORM,我们决定将 nHIbernate 与 asp.net mvc3 一起使用。我们通过以下方式设置我们的项目:

  1. NHibernate 存储库 [包含 nhibernate 的映射、服务和存储库]
  2. MVC3 [这是一个 UI]
  3. 测试 MVC NHibernate [这是一个带有 NUnit 的测试项目]

在上面,[] 文本被写入以明确层。

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

“配置持久层时发生异常。”

完整的堆栈跟踪如下:

在 NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\ConfigurationSchema\HibernateConfiguration.cs:line 55 在 NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\ConfigurationSchema\HibernateConfiguration.cs:line 36 在 NHibernate.Cfg.Configuration.Configure(XmlReader textReader) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1511 在 NHibernate.Cfg.Configuration.Configure(String fileName, Boolean ignoreSessionFactoryConfig) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1433 在 NHibernate.Cfg.Configuration.Configure(String fileName) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1418 在 NHibernate.Cfg.Configuration.Configure() 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1404 在 D:\example\examplemvcapp-NHExample\examplemvcapp\NHibernateRepository.cs:line 33 中的 examplemvcapp.NHibernateRepository..ctor() 在 D:\example\examplemvcapp-NHExample\examplemvcapp-NHExample.UI\Models\Department.cs:line 70 中的 examplemvcapp_NHExample.UI.Models.CreateAppraisalModel..ctor()

请注意 NHIbernate 的所有配置设置在 MVC3 应用程序中与在测试项目中相同。

以下是我们遇到异常的人:

using (var nhr = new NHibernateRepository())
{
    this.Departments = nhr.GetAll<Departments>().Select(x => new SelectListItem 
        {
            Text = x.Departmentdescription, Value = x.Id.ToString()
        });
}

上面会出现以下情况并抛出异常:

public NHibernateRepository()
{
    if (sessionFactory == null)
    {
        config = new Configuration();
        config.Configure();
        config.AddAssembly(typeof(NHibernateRepository).Assembly);
        sessionFactory = config.BuildSessionFactory();
    }
    Session = sessionFactory.OpenSession();
    transaction = Session.BeginTransaction();
    Rollback = false;
}

以上在测试项目中运行良好:

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

以下是放置在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 所需的所有 dll。

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

在 MVC3 应用程序项目中保持相同。

在这方面的任何帮助都是非常可观的。

问候

【问题讨论】:

  • @Bertrand - 非常感谢格式化。我真的很想这样做,但没能做到。
  • nunit 和 Web 应用程序倾向于以不同的方式读取配置文件。请提供有关如何设置 NHibernate 配置的更多信息(它在哪个文件中,存在哪些值等)。
  • @Michael - 用更多细节更新了原始问题。
  • 谢谢大家!我解决了这个问题。我最后犯了一个愚蠢的错误:(将hbm文件制作为嵌入并且一切正常:)
  • 如上所述,我找到并通知了解决方案,我将此问题标记为已关闭。啊!我试图将其标记为已关闭,但我没有找到从关闭窗口询问的任何有效选项。我请求版主请关闭此问题

标签: nhibernate asp.net-mvc-3 razor nunit


【解决方案1】:

我不确定这是否能解决您当前的问题,但我确实有一些建议。首先,在您的Global.asax 或(我的偏好)中通过 HttpModule 实现 session-per-request 会话管理。这是一个简单的例子:

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
    }
}

请注意,这还会在请求管理期间绑定当前会话上下文。

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

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

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

【讨论】:

  • 感谢您的回复,但我们在创建 sessionfactory 之前得到,请参考完整的问题和 sn-p。
  • 代码库代码中的第 33 行是哪一行(这样我们就可以确切地知道错误是在哪里引发的)?
  • 第 33 行包含:config.Configure();
  • 我怀疑这与配置文件的位置有关。如果您在您的网络应用程序中没有配置文件,它可能无法工作。如果您的存储库项目是一个类库,您将需要将该配置放入 Web 项目中。或者您可以将其放入您的 web.config 中,如下所述:bradhe.wordpress.com/2010/06/22/…
  • 感谢 Josh - 相同的配置和相同的结构在 asp.net 项目中运行良好,但它仅在 mvc3 项目中出现问题。
【解决方案2】:

根据@Michael - 我正在通过提供以下答案来关闭此线程,这是我在研究期间发现的。

要找到正确的解决方案,我们需要做两件事;

  1. 如果使用 XML 文件,我们需要将它们设置为嵌入在属性中
  2. 如果不使用xml文件-我们需要编译

要在上面进行设置,只需从解决方案资源管理器中选择文件名,然后按 F4 或通过右键单击文件名然后单击属性链接来查看属性窗口。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多