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

时间:2011-05-03 21:55:55

标签: c# nhibernate webforms

我遇到了一个有趣的错误,我正在研究一个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.NET FWIW)。我可以看到NHibernate生成的SQL,一切看起来都很完美。当我尝试在ASP.NET应用程序中使用我的库时,问题就开始了。

我想要做的是将ListView绑定到ObjectDataSource。为此,我编写了一个GenreProvider,这只是获取可用Genre个对象的列表。在单元测试中,这很好用。只要在ASP应用程序中运行任何与NHibernate相关的内容,我就会抛出NHibernate.MappingException: No persister for: Genre个异常并且一切都会出错。

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

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

(这是一个通用的Repository类 - 但它在单元测试中完美运行)。

总结一下:NHibernate在我的单元测试中似乎正常工作,但在ASP应用程序中使用时失败了。我确信这在我的配置中存在问题,但是谷歌搜索了“没有持久性”错误(解决方案包括确保映射文件的'嵌入资源'设置,AddClass的各种组合,{{1关于配置,在我的配置中设置AddAssembly等,但没有成功)但很可能看不到树木。

任何人都可以对此有所了解并阻止我疯狂吗? (如果需要,我可以发布更多代码,阻止信息过载!)

谢谢!

1 个答案:

答案 0 :(得分:2)

尝试在hibernate-configuration文件中添加此内容(或者确实是web.config,如果它存在的话)

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