Настройка NHibernate через Web.config в ASP.NET 4.0 - PullRequest
4 голосов
/ 22 июня 2010

Так что мои модульные тесты зеленые, пришло время интегрировать этот новый DAL на основе NHibernate в мое веб-приложение! Я на самом деле не хочу поддерживать два файла конфигурации, поэтому я перенес файл hibernate.cfg.xml в свой файл Web.config (т.е. я скопировал содержимое файла hibernate.cfg.xml в свой файл Web.config). Вот соответствующие биты из моего Web.config:

<configSections>
  <section name="combres" type="Combres.ConfigSectionSetting, Combres, Version=2.0.0.0, Culture=neutral, PublicKeyToken=49212d24adfbe4b4"/>
  <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>

<nhibernate xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Data Source=(local)\SQLExpress;Initial Catalog=MyProject;Integrated Security=True</property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <listener class="MyProject.Sql.Listeners.SaveEventListener, MyProject" type="save"/>
    <listener class="MyProject.Sql.Listeners.UpdateEventListener, MyProject" type="update"/>
  </session-factory>
</nhibernate>

В Global.asax на Application_Start я пытаюсь инициализировать свою конфигурацию:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);

    SessionProvider.Initialize();
}

Все, что на самом деле делает, это вызывает new Configuration().Configure().AddAssembly("MyProject"); в соответствии с приведенным выше кодом конфигурации.

Интересный результат: когда я впервые захожу на страницу, выдается исключение:

[FileNotFoundException: Could not find file 'D:\Build\MyProject\Source\MyProject.Web\bin\hibernate.cfg.xml'.]

Ну, я поместил конфигурацию в Web.config, разве она не должна выглядеть там? Нужно ли указывать «эй, NHibernate, обратите внимание - данные конфигурации находятся в Web.config, фиктивный!» где-нибудь? * * 1013

Когда я нажимаю F5, появляется страница. Ура! Теперь я пытаюсь что-то сделать с доступом к данным и получаю следующее исключение:

[ProxyFactoryFactoryNotConfiguredException: The ProxyFactoryFactory was not configured.
Initialize 'proxyfactory.factory_class' property of the session-factory configuration section with one of the available NHibernate.ByteCode providers.
Example:
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
Example:
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>]

Да, это тоже немного странно - это отлично работало в тесте с конфигурацией в hibernate.cfg.xml ... и я указываю это свойство в моем файле Web.config ... Интересно, что может быть?

Так, у кого-нибудь есть идеи? Любая помощь в разгадывании этой тайны будет супер!

* Обновление: Я нашел проблему. Похоже, я не использовал правильный тип в моем разделе конфигурации! D'о. У меня есть полная запись в моем блоге .

Ответы [ 2 ]

4 голосов
/ 22 июня 2010

Попробуйте вызвать метод .Configure() в конце:

new Configuration().AddAssembly("MyProject").Configure();

Или, если хотите, поместите его в web.config:

<nhibernate xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="">
    ...    
    <mapping assembly="MyProject" />
  </session-factory>
</nhibernate>

и затем:

new Configuration().Configure();

Также убедитесь, что в вашем веб-проекте есть ссылка на сборку NHibernate.ByteCode.Castle.dll.

3 голосов
/ 22 июня 2010

Оказывается, я использовал неправильный тип в разделе конфигурации. Вам нужно использовать обработчик раздела NHibernate, а не общий .NET. Поведение, которое я видел, было связано с тем, что все было загружено в синглтоне. При первом посещении конфигурация потерпит неудачу. При последующих посещениях он просто выдавал странные ошибки, потому что изначально конфигурация не удалась!

Есть еще одно предупреждение - У меня полная запись в моем блоге .

...