У меня есть интересная ошибка с приложением веб-форм ASP.NET, над которым я работал.Я использую 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).Я вижу SQL, сгенерированный NHibernate, и все выглядит идеально.Проблемы начинаются, когда я пытаюсь использовать свою библиотеку в приложении ASP.NET.
Я хотел бы привязать 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>();
(Это в общем классе репозитория - однако он отлично работает во время юнит-тестов).
Итак, в итоге: NHibernate, кажется, работает правильно во время моих юнит-тестов, но не работает при использовании вASP-приложение.Я уверен, что это проблема в моей конфигурации, но я искал Google на отсутствие ошибок (решения включали обеспечение настройки «Встроенный ресурс» для отображения файлов, различные комбинации AddClass
, AddAssembly
и т. Д. Вконфигурация, настройка <mapping assembly="..." />
в моем конфиге и т. д., но безуспешно), но, скорее всего, не может увидеть дерево для деревьев.
Может кто-нибудь пролить свет на это и не дать мне сойти с ума?(Я могу опубликовать больше кода, если необходимо, отложил для предотвращения информационной перегрузки!)
Спасибо!