Нет постоянной ошибки при использовании NHibernate с ASP.NET, модульные тесты работают правильно - PullRequest
1 голос
/ 04 мая 2011

У меня есть интересная ошибка с приложением веб-форм 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="..." /> в моем конфиге и т. д., но безуспешно), но, скорее всего, не может увидеть дерево для деревьев.

Может кто-нибудь пролить свет на это и не дать мне сойти с ума?(Я могу опубликовать больше кода, если необходимо, отложил для предотвращения информационной перегрузки!)

Спасибо!

1 Ответ

2 голосов
/ 04 мая 2011

Попробуйте добавить это в свой hibernate-configuration файл (или даже в web.config, если он там находится)

<property name="current_session_context_class">web</property>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...