在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="..." />
等,但没有成功),但很可能无法看到树木的木材。
有谁能给我一点启示,让我不要发疯吗?(如果需要,我可以发布更多的代码,为了防止信息过载,我已经保留了!)
谢谢!
尝试将此添加到您的hibernate-configuration
文件(或者实际上您的web.config
,如果它在那里)
<property name="current_session_context_class">web</property>