Введение в NHibernate. Часть 1. ОБНОВЛЕНО

     Где, кто, что, когда, почему?

     NHibernate — ORM-решение для платформы Microsoft .NET портированное с Java. Это бесплатная библиотека с открытым кодом, распространяется под лицензией GNU Lesser General Public License. NHibernate позволяет отображать объекты бизнес-логики на реляционную базу данных. По заданному XML-описанию сущностей и связей NHibernate автоматически создает SQL-запросы для загрузки и сохранения объектов. (Wiki).

     Текущая версия 2.1.2. Также доступна 3.0.0. Alpha3. Скачать можно здесь: NHibernate

     Маппинг с помошью NHibernate

     Инициализация

   Необходимо выполнить четыре шага:

  1. Предоставить информацию для доступа к базе данных
  2. Настроить log4net
  3. Предоставить информацию для мэппинга сущностей.
  4. Создать фабрику сессий (SessionFactory)

     Доступ к БД

    Мы должны изменить конфигурационный файл, чтобы сказать нашему приложению как инициализировать HNibernate. Мы можем это сделать в отдельном конфигурационном файле, или, мой предпочтительный вариант, внутри файла app.config. Вы можете скопировать файл nhibernate-configuration.xsd в папку Visual Studio common7/packages/schemas/xml, чтобы работал intellisense,

     Мы настроим четыре свойства для доступа к базе данных:

  • CoonectionProvider - это значение никогда не меняется, провайдер для подключения к БД.
  • Dialect - зависит от БД.
  • ConnectionDriver - драйвер соединения, зависит от БД
  • ConnectionString - Строка, используемая для создания подключения к базе данных.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="dialect">
NHibernate.Dialect.MsSql2000Dialect
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
Initial Catalog=nhibernate;Integrated Security=SSPI
</property>
</session-factory>
</hibernate-configuration>
</configuration>

     Это позволяет нам создавать SessionFactory. SessionFactory - требует много ресурсов для инициализации, поэтому создаем только один. Грубый пример: мы просто делаем его статическим членом класса. Но главное, что нужно понять, вы создаете SessionFactory один раз, в начале и затем создаете сессий, когда вам нужно взаимодействовать со сущностями.

public class Program
{
private static ISessionFactory sessionFactory = null;
public static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
Configuration cfg = new Configuration();
cfg.Configure();
sessionFactory = cfg.BuildSessionFactory();
}
}

     Настройка Log4Net


     NHibernate использует log4net для журнала, так после настройки log4net, вы сможете увидеть все ошибки, которые произошли. Настроим log4net путем добавления конфигурационного файла.

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender, log4net">
<layout type="log4net.Layout.PatternLayout, log4net">
<param name="ConversionPattern" value="%m" />
</layout>
</appender>
<root>
<priority value="WARN" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>

     Добавление следующей строки означает, что вам не нужно перезапустить приложение, чтобы сделать изменения:

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

     Мы должны добавить ссылку на библиотеку log4net.dll, (он доступен с NHibernate). Мы вызываем log4net.Config.XmlConfigurator.Configure() перед началом настройки NHibernate. Этот вызов активирует log4net.

log4net.Config.XmlConfigurator.Configure();

     В следующий раз


     Мы посмотрим на мэппинг сущностей.   


     По материалам серии: Ian Cooper


     UPDATE: нашел хороший блог где описывается NHibernate, так как в плане у меня были почти такие темы, как и там, считаю не целесообразным переписывать, вот ссылка на блог: http://slynetblog.blogspot.com/2009/10/nhibernate-1.html 


      Здесь про fluent nhibernate: http://www.netcoder.ru/tag/NHibernate/


     И еще пара ссылок: 1 2

6

  1. Владимир Анатольевич комментирует...:

    о главное, что нужно понять, вы создаете SessionFactory один раз, в начале и затем создаете сессий, когда вам нужно взаимодействовать со сущностями. -- Вы по русски пишете? Бля, нихуя не понял:)

  1. sharok комментирует...:

    Что непонятно, вроде ясно написано. Все операции выполняются через сессии. SessionFactory требует много ресурсов, создается один раз, для различных операции просто открываются новые сессии (создание объекта ISession), это происходит относительно быстро.

  1. Unknown комментирует...:

    если честно тоже не совсем понял, с NHibernate не знаком вообще, да и в шарпе слабоват
    я уяснил так что ISessionFactory служит ля управления объектами ISession? Т.е. не имея ни одного объекта ISessionFactory я не смогу создать ISession? Я прав?
    И, да, продолжайте писать, с интересом читаю, подписался на ваш блог! Спасибо.

  1. Victor комментирует...:

    Скажите, почему Вы решили написать статью о NHibernate? Прежде чем ее писать, Вы искали подобные вещи? Если ли у Вас готовые, работающие с NHibernate проекты? Чем ваша статья лучше этого http://www.nestor.minsk.by/kg/2005/32/kg53209.html или этого http://habrahabr.ru/blogs/net/37984/? Было бы очень хорошо, если бы вводная статья содержала ссылки на уже существующие ресурсы, чем то их дополняла. Ну и конечно хорошо было бы упомянуть о других ORM.

  1. sharok комментирует...:

    Victor
    смотрел ваши ссылки, но которая на хабре, продолжения так и не появилось, здесь более подробно будет рассматриваться

  1. Анонимный комментирует...:

    Mikhail
    ДА. У SESSIONFACTORY ЕСТЬ МЕТОД OPENSESSION()

Отправить комментарий