Перевод статьи «NHibernate Basics» с сайта codeproject.com.

Ведение


Nhibernate это решение для Объектно Реалицонного мапинга для платформы .NET. Этот фреймворк позволяет делать мапинг Объектно ориентированных моделей к традиционным БД. Его основное преимущество маппирование классов .Net к таблицам БД и от типов данных CLR в типы SQL.

Как указано в заголовке нашей статьи, мы посмотрим: Как загружать бизнес объекты из БД и сохранять измененные объекты обратно в БД.

Подготовка


Демо приложение покажет нам как наиболее легким путем установить и и использовать NHibernate. Приложение создает объект Employee объект и сохраняет его в таблице Employee. Оно также делает некоторые операции такие как получение и удаление объектов Employee. Это приложение было создано с помощью NHibernate 3.2.0, VS 2010 и SQL Server 2008.

Использование кода


База Данных

Сначала мы настроим базу данных. Используйте SQL Server Managment Strudio для создания базы данных и работы с ней. Как показано ниже создайте новую БД, и назовите ее NHibernateBasics.



Затем добавьте таблицу Employee с двумя столбцами;ID и NAME.



Столбец ID должен быть первичным ключом, и должен быть автоинкрементом. Не забудьте включить Identity Specification в свойствах столбца.



Бизнес Объекты

БД готова для демонстрации. Теперь запускаем Студию и создаем новое приложение WindowsFormApplication, проект назовем NhibernateBasics.
Добавьте новый класс, назовите его Employee.cs и вставьте следующий код.

namespace NHibernateBasics
{
    public class Employee
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
    }
}

Одна из сильных сторон Nhibernate это то что ему не нужно специальных интерфейсов для бизнес классов. Эти объекты не зависят от механизма загрузки и сохранения данных. Однако требуется чтобы свойства класса были описаны как виртуальные, чтобы они могли создавать Proxi.

Мапирование XML файла

Из-за отсутствия специфического кода для гибернации, кто то должен взять на себя ответственность за трансляцию из БД в бизнес-объекты и обратно. Эта трансляция может быть выполнена с помощью связывания через XML файл или связывания атрибутов на классы и свойства.
В нашем демо приложении, мы использовали маппинг файл чтобы не захламлять класс бизнес объекта.

Добавьте новый XML файл в проект. XML файл будет использоваться как маппинг файл. Имя файла должно быть Employee.hbm.xml. Файл класса <name>.cs и маппинг файл <name>.hbm.xml должны лежать в одной папке и <name> должно быть одинаково.

Добавьте следующий код в файл.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
	namespace="NHibernateBasics" assembly="NHibernateBasics">
  <class name="Employee" table="Employee">
    <id name="ID" column="ID">
      <generator class="identity"/>
    </id>
    <property name="Name" column="Name"  />
  </class>
</hibernate-mapping>

В свойствах XML файла выставите свойство Build Action = Embedded Resource.



Конфигурация

Добавьте новый конфигурационный файл приложения (app.config).
Скопируйте следующий код.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" 
	type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">
	NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="query.substitutions">hqlFunction=SQLFUNC</property>
      <property name="connection.driver_class">
	NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">
	Data Source=(Local)\SQL2008;Initial Catalog=NHibernateBasics;
	Integrated Security=True</property>
      <property name="show_sql">true</property>
      <mapping assembly="NHibernateBasics" />
    </session-factory>
  </hibernate-configuration>
</configuration>

Настройте свойство Connection-string чтобы подключиться к вашей БД. Выставите свойство CATALOG=<Dabase name> , значением NHibernateBasics. Выставите свойство mapping assembly=<Class DLL name> , опять же значением NHibernateBasics.

Демонстрация



Итак у нас уже почти все готово для демонстрации. Нам только нужен доступ к бизнес объектам, чтобы выполнить пару операций над ними.

Сохранение:

using(mySession.BeginTransaction())
{
    // Insert two employees in Database
    mySession.Save(myInitialObjects[0]); 
    mySession.Save(myInitialObjects[1]); 
    mySession.Transaction.Commit(); 
} 


Загрузка:

using(mySession.BeginTransaction())
{
    // Создаем критерию и загружаем данные
    ICriteria criteria = mySession.CreateCriteria<employee>();
    IList<employee> list = criteria.List<employee>();
    for (int i = 0; i < myFinalObjects.Length; i++)
    {
        myFinalObjects[i] = list[i];
        MessageBox.Show("ID: " + myFinalObjects[i].ID + " 
			Name: " + myFinalObjects[i].Name);
    }
    mySession.Transaction.Commit();
 }

Сравнение:

StringBuilder messageString = new StringBuilder();
// Сравниваем два обьекта
for (int i = 0; i < 2; i++)
{
    messageString.AppendLine("Comparing Class Object " + 
	myInitialObjects[i].Name + " and DB Object " + 
	myFinalObjects[i].Name + ". Result = " + 
	myInitialObjects[i].Equals(myFinalObjects[i]).ToString());
}
MessageBox.Show(messageString.ToString());

Удаление:

using (mySession.BeginTransaction())
{
    // Delete one object from Database
    mySession.Delete(myInitialObjects[0]);
    mySession.Transaction.Commit();
}


Отображение:

using (mySession.BeginTransaction())
{
     ICriteria criteria = mySession.CreateCriteria<employee>();
     IList<employee> list = criteria.List<employee>();
     StringBuilder messageString = new StringBuilder();
     // Load and display the data
     foreach (Employee employee in list)
     {
         messageString.AppendLine("ID: " + employee.ID + " Name: " + employee.Name);
     }
     MessageBox.Show(messageString.ToString());
}

NHibernte гарантирует нам что две ссылки на объект будут указывать на один и тот же объект если ссылки установлены в одной сессии. Если мы сохраним объекты в одной сессии и загрузим в другой, то два объекта будут разными.

Надеюсь статья смогла вам понять основы Nhibernate.

Happy coding /////

Файл проекта: NHibernateBasics.zip

Это не последняя статья по Nhiberante. Какие еще статьи вы хотели бы видеть переведенными по Nhibernate тематике?

Комментарии (8)


  1. olen
    23.09.2015 16:55
    -3

    Хотелось бы сначала услышать, чем Nhibernate лучше Entity Framework.


    1. maseal
      23.09.2015 19:27

      Зачем? Статья вроде совсем не об этом.
      А если хочется статью-сравнение «Entity Framework vs NHibernate», то перевод такой статьи был на хабре пару месяцев назад.


      1. olen
        23.09.2015 22:26

        Это была моя первая мысль, когда увидел эту статью: зачем разбираться с NHibernate, если есть EF? Я знаю, что NHibernate появился раньше, но есть ли смысл использовать его в новых проектах? Стоит ли тратить время на изучение?

        P.S. Статья по вашей ссылке лежит в закладках, но пока не добрался :-(


    1. semmaxim
      29.09.2015 14:43

      EF гораздо проще, нормально работает только с MSSQL и возможностей в нём гораздо меньше. Хотя развивается вроде быстрее, чем NHibernate. Плюс кое-какие архитектурные различия.


  1. SOLON7
    23.09.2015 16:59
    -2

    Я не буду щас углубляться в детали! не хотелось устраивать очередной холли вар, позже будут переведены статьи и бенчмарки сравнение орм-ов! вот там скорее всего и будет холи вар! какой лучше итд!


    1. maseal
      25.09.2015 09:50

      позже будут переведены статьи и бенчмарки сравнение орм-ов

      Такое ощущение, что вы собираетесь заниматься тем, чем уже 100500 человек занималось и все результаты давно опубликованы. Начиная со stackoverflow и заканчивая более-менее известными блоггерами:
      weblogs.asp.net/fbouma/fetch-performance-of-various-net-orm-data-access-frameworks
      weblogs.asp.net/fbouma/fetch-performance-of-various-net-orm-data-access-frameworks-part-2
      (этот товарищ, конечно, отчасти своё детище пиарит, но и другие ORM там представлены в неплохом объеме)


      1. SOLON7
        25.09.2015 11:15

        Ну а почему нет! Мне например очень нравиться заниматься статьями где указываются скорость различных решений! Например первый пост говорит чем лучше? После перевода статей когда на хабре будет много статей по сравнению они! Хабражители смело смогут правильно выбрать какое решение чем лучше а какое хуже! Просто если начать писать сложную систему, лучше заранее знать кто на что горазд, разве нет?


  1. AndreyDaeron
    24.09.2015 20:35

    А есть какие-то статьи которые описывают более современное положение вещей? VS2010, версия 3.2, XML-основанная конфигурация…
    Такое ощущение, что проект не особо развивается, или уже все написанно, или Entity его вытеснил.

    Или это так как NHibernate используется в продакшене?