在ASP中使用NHibernate没有持久性错误.. NET,单元测试工作正常

本文关键字:NET 错误 单元测试 工作 持久性 ASP NHibernate | 更新日期: 2023-09-27 17:54:46

我有一个有趣的错误与ASP。. NET webforms应用程序,我一直在工作。我正在使用NHibernate(常规,不流畅),连接到sqlite数据库,具有以下映射和配置:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>    
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
    <property name="connection.connection_string">Data Source=C:'Path'To'Database.db;Version=3</property>
    <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
    <property name="query.substitutions">true=1;false=0</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

有许多实体,但下面是一个简单的例子:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="XBMC.Data"
                   namespace="XBMC.Data.Model.Domain">
  <class name="Genre" table="genre">
    <id name="Id" column="idGenre" type="int">
      <generator class="native"/>
    </id>
    <property name="Name" column="strGenre" type="string" />
  </class>
</hibernate-mapping>

该文件被配置为嵌入式资源。这与:

密切相关
public class Genre : IRecord
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

还有一个NHibernateHelper类用于抓取会话(我从http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx收集了大部分内容,这是一个关于开始使用NHibernate的很棒的教程)。

public class NHibernateHelper
{
    private static ISessionFactory _sessionFactory;
    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                Configuration config = new Configuration();
                config.Configure();
                config.AddAssembly(typeof(IRecord).Assembly);
                _sessionFactory = config.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }
    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

到目前为止一切顺利。我一直遵循测试驱动的开发方法,并且有如下的一些测试用例:

[Test]
public void CanLoadGenre()
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        Genre g = session.Get<Genre>(759);
        Assert.That(g.Name, Is.EqualTo("Action"));
    }
}

这些工作得很好(我使用最新版本的NUnit与TestDriven。就其价值而言)。我可以看到NHibernate生成的SQL,一切看起来都很完美。当我尝试在ASP中使用我的库时,问题就开始了。网络应用程序。

我想做的是绑定一个ListView到一个ObjectDataSource。要做到这一点,我已经写了一个GenreProvider,这只是得到一个可用的Genre对象的列表。在单元测试中,这工作得很好。只要任何与nhibernate相关的东西在ASP应用程序中运行,我就会得到NHibernate.MappingException: No persister for: Genre异常抛出,一切都出错了。

具体来说,它在下一行(return语句)失败:

using (ISession session = NHibernateHelper.OpenSession())
    return session.CreateCriteria(typeof(T).Name).List<T>();

(这是在一个通用的Repository类中——但是它在单元测试中工作得很好)。

总结一下:在我的单元测试中,NHibernate似乎工作正常,但在ASP应用程序中使用时就失败了。我相信这是我的配置中的一个问题,但是已经搜索了谷歌的"无持久性"错误(解决方案包括确保映射文件的"嵌入式资源"设置,配置上的AddClass, AddAssembly等的各种组合,在我的配置中设置<mapping assembly="..." />等,但没有成功),但很可能无法看到树木的木材。

有谁能给我一点启示,让我不要发疯吗?(如果需要,我可以发布更多的代码,为了防止信息过载,我已经保留了!)

谢谢!

在ASP中使用NHibernate没有持久性错误.. NET,单元测试工作正常

尝试将此添加到您的hibernate-configuration文件(或者实际上您的web.config,如果它在那里)

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