MVC3 Razor с nHibernate - PullRequest
       13

MVC3 Razor с nHibernate

0 голосов
/ 27 августа 2011

В качестве известного ORM мы решили использовать nHIbernate с asp.net mvc3. Мы настроили наш проект следующим образом:

  1. Репозиторий NHibernate [содержит сопоставления, службы и репозитории для nhibernate]
  2. MVC3 [это пользовательский интерфейс]
  3. Test MVC NHibernate [это тестовый проект с NUnit]

В приведенном выше тексте [] написано, чтобы прояснить слои.

Все работает нормально, означает, что все модульные тесты пройдены для операций сопоставления, вставки, обновления, удаления. К сожалению, когда мы выполняем ту же операцию из нашего приложения mvc3, оно выдает следующую ошибку:

   "An exception occurred during configuration of persistence layer."   

Полная трассировка стека выглядит следующим образом:

   at NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\ConfigurationSchema\HibernateConfiguration.cs:line 55
   at NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\ConfigurationSchema\HibernateConfiguration.cs:line 36
   at NHibernate.Cfg.Configuration.Configure(XmlReader textReader) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1511
   at NHibernate.Cfg.Configuration.Configure(String fileName, Boolean ignoreSessionFactoryConfig) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1433
   at NHibernate.Cfg.Configuration.Configure(String fileName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1418
   at NHibernate.Cfg.Configuration.Configure() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1404
   at examplemvcapp.NHibernateRepository..ctor() in D:\example\examplemvcapp-NHExample\examplemvcapp\NHibernateRepository.cs:line 33
   at examplemvcapp_NHExample.UI.Models.CreateAppraisalModel..ctor() in D:\example\examplemvcapp-NHExample\examplemvcapp-NHExample.UI\Models\Department.cs:line 70  

Обратите внимание, что все параметры конфигурации для NHIbernate в приложении MVC3 такие же, как и в тестовом проекте.

Вот парень, у которого мы получили исключение:

using (var nhr = new NHibernateRepository())
{
    this.Departments = nhr.GetAll<Departments>().Select(x => new SelectListItem 
        {
            Text = x.Departmentdescription, Value = x.Id.ToString()
        });
}

Выше приведут до следующего и выкинут исключение:

public NHibernateRepository()
{
    if (sessionFactory == null)
    {
        config = new Configuration();
        config.Configure();
        config.AddAssembly(typeof(NHibernateRepository).Assembly);
        sessionFactory = config.BuildSessionFactory();
    }
    Session = sessionFactory.OpenSession();
    transaction = Session.BeginTransaction();
    Rollback = false;
}

В тестовом проекте выше все работает нормально:

using (var nhr = new NHibernateRepository())
{
    var DeptList = nhr.GetAll<Departments>();
}

Ниже приведен файл hibernate.cfg.xml, размещенный в проекте NHibernateRepository:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Data Source=(local);Initial Catalog=myDatabaseName;Integrated Security=True</property>
    <property name="show_sql">true</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="cache.use_query_cache">false</property>
    <property name="adonet.batch_size">100</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

  </session-factory>
</hibernate-configuration>

Помимо этого, в этом проекте есть все dll, необходимые для NHibernate.

В тестовом проекте нет специальных настроек конфигурации, мы просто добавляем ссылку на проект репозитория и другие сборки, необходимые для этого, и он работает нормально.

То же самое поддерживалось в проекте приложения MVC3.

Любая помощь в этом отношении наиболее заметна.

Привет

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Per @Michael - Я закрываю эту ветку, предоставляя следующий ответ, который я нашел во время моего исследования.

Для правильного решения нужно сделать две вещи:

  1. При использовании файлов XML нам нужно установить их как встроенные в свойствах
  2. Если не использовать XML-файлы - нам нужно сделать скомпилированный

Чтобы установить выше, просто выберите имя файла из решения исследования и нажмите F4 или Просмотреть окно свойств, щелкнув правой кнопкой мыши имя файла и затем ссылку на свойство.

Спасибо всем, кто ответил на вышеуказанный вопрос.

1 голос
/ 27 августа 2011

Я не уверен, что это решит ваши текущие проблемы, но у меня есть несколько рекомендаций.Во-первых, реализуйте управление сеансом для каждого запроса, либо в вашем Global.asax, либо (в моем предпочтении) через HttpModule.Вот простой пример:

public class NHHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += ApplicationEndRequest;
        context.BeginRequest += ApplicationBeginRequest;
    }

    public void ApplicationBeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.GetNewSession());
    }

    public void ApplicationEndRequest(object sender, EventArgs e)
    {
        var currentSession = CurrentSessionContext.Unbind(SessionFactory.GetSessionFactory());
        currentSession.Close();
        currentSession.Dispose();
    }

    public void Dispose()
    {
        // Do nothing
    }
}

Обратите внимание, что это также связывает текущий контекст сеанса во время управления запросами.

Также убедитесь, что вы устанавливаете правильный контекст сеанса.Тесты, вероятно, должны использовать контекст thread, но веб-приложения должны использовать контекст web.Я лично настраиваю это через Fluent NHibernate, но я верю, что в XML-файлах конфигурации это будет выглядеть как:

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

Опять же, я обычно настраиваюсь с помощью FNH, поэтому убедитесь, что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...