我遇到了一个有趣的错误,我正在研究一个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
等,但没有成功)但很可能看不到树木。
任何人都可以对此有所了解并阻止我疯狂吗? (如果需要,我可以发布更多代码,阻止信息过载!)
谢谢!
答案 0 :(得分:2)
尝试在hibernate-configuration
文件中添加此内容(或者确实是web.config
,如果它存在的话)
<property name="current_session_context_class">web</property>