Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


NHibernate & его ORM. Как быстро начать работать.

Поиск:
Итак приступим. Что у нас есть? У нас БД. Допустим на MSSql сервере, скажем 2005, но это не важно. БД любая. Пишем на C# под 2005 VS. Итак что же нам надо что бы все хорошо сделать?
1. Программка MyGeneration(далее майген или МГ). Я использую версию 1.3
2. Шаблон NHibernate Object Mapping автора k-dub.
<a href="http://www.mygenerationsoftware.com/portal/default.aspx">Все эти вещи берем тут</a>.

Ставим МГ. Запускаем. Настраиваем подключение к нашей БД. Выбираем шаблон и запускаем.
Появится окно:
<a href="http://pics.livejournal.com/vadim_kup/pic/000019tc/"><img width="260" height="240" border="0" src="http://pics.livejournal.com/vadim_kup/pic/000019tc/s320x240" /></a>
Выбираем NameSpace для классов. Префикс для скрытых членов класса. Требуемые таблицы. И остальные настройки по своему усмотрению. Жмем ок. У нас сгенерится hbm.xml файлы и классы для хибера.

Далее создаем проект в студии. Для удобства создаем новую папку в сборке. Скажем Objects. И добавляем туда все сгенерированные файлы. ИМЕННО ВСЕ!
Далее нам надо указать у всех hbm.xml файлов что они являются Embedded Resource. Это делается в свойствах файла.
Ну вот объекты готовы. Отлично. Хлопаем в ладоши, хаваем булочки. Но нам надо настроить хибер на работу с БД и связать его с объектами.
Добавляем хиберовские сборки. Где их взять? <a href="http://www.hibernate.org">Тут</a>.
Нужны следующие сборки:
NHibernate.dll
Также нам нужно создать файл настроек приложения. Туда следующее:
*********************************************
&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
&lt;configSections&gt;
&lt;section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /&gt;
&lt;/configSections&gt;

&lt;nhibernate&gt;
&lt;add   key="hibernate.show_sql"   value="true"  /&gt;
&lt;add   key="hibernate.connection.provider"   value="NHibernate.Connection.DriverConnectionProvider"  /&gt;

&lt;add   key="hibernate.dialect"   value="NHibernate.Dialect.MsSql2000Dialect"  /&gt;
&lt;add   key="hibernate.connection.driver_class"   value="NHibernate.Driver.SqlClientDriver"  /&gt;
&lt;add   key="hibernate.connection.connection_string"   value="Data Source=kn002sqlexpress;Initial Catalog=Diplom;Integrated Security=True"  /&gt;

&lt;/nhibernate&gt;

&lt;/configuration&gt;
*********************************
Смотрим все ли совпадает. У мну хибер 1.2.0
В теге
&lt;add   key="hibernate.connection.connection_string"   value="Data Source=kn002sqlexpress;Initial Catalog=Diplom;Integrated Security=True"  /&gt;  указываем путь к своей БД. Диалект можно поставить 2005.
Теперь можно создать класс контроллер, который будет позволять нам работать с объектами хибера.
Пример:
***************************************************
using NHibernate;
using NHibernate.Cfg;
using WindowsApplication2.Objects;

namespace WindowsApplication2
{
public class DataController
{

private ISessionFactory _sessions;

public DataController()
{
Configuration cfg = new Configuration();
cfg.AddClass(typeof (DataElement));
cfg.AddClass(typeof(Pins));
cfg.AddClass(typeof (WindowsApplication2.Objects.Properties));
cfg.AddClass(typeof(Library));
_sessions = cfg.BuildSessionFactory();
//new SchemaExport(cfg).Create(true, true);//Для создания бд раскоментить
}

public int SaveElement(DataElement el)
{
ISession session = _sessions.OpenSession();
ITransaction tx = null;
try
{
tx = session.BeginTransaction();
int ID = (int)session.Save(el);
tx.Commit();
return ID;

}
catch (HibernateException e)
{
if (tx != null) tx.Rollback();
throw e;
}
finally
{
session.Close();
}
}

}
}
*******************************************
Извините за названия сборок.)
Что тут происходит? В конструкторе контроллера мы начинаем конфигурировать хибернейт. И строим сессию исходя из конфига.
Закоменченная строка позволяет создавать БД, исходя из конфига. Мы добавляем наши классы хибера cfg.AddClass(typeof (DataElement)); и так для каждого класса хибера.

Также тут представлен метод сохранения объекта. Работаем с хибером следующем образом:
Открываем сессию. Начинаем транзакцию. Делаем что нам нужно. Подтверждаем транзакцию. Если ошибки, отколоняем транзакцию. И всегда закрываем сессию. Для работы метода передаем хиберовский объект.
Разберемся получше с объектами хибернейта.
Маппинг:
**********************
&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&gt;
&lt;class name="Diplom.Data.Pins,Diplom.Data" table="Pins" lazy="false" &gt;

&lt;id name="Id" column="ID" type="Int32" unsaved-value="0"&gt;
&lt;generator class="native"/&gt;
&lt;/id&gt;
&lt;property column="X" type="Int32" name="X" /&gt;
&lt;property column="Y" type="Int32" name="Y" /&gt;
&lt;many-to-one name="FkElement" column="FKElement" class="Diplom.Data.DataElement,Diplom.Data" /&gt;
&lt;property column="Number" type="Int32" name="Number" /&gt;

&lt;/class&gt;
&lt;/hibernate-mapping&gt;

**********************
&lt;id name="Id" column="ID" type="Int32" unsaved-value="0"&gt;
&lt;generator class="native"/&gt;
&lt;/id&gt;
это описание PK. Name - имя в классе хибера. Column - имя в БД. И выбираем тип генератора. О всех генераторах смотри в доках по хиберу.
&lt;property column="Y" type="Int32" name="Y" /&gt; описание столбца. Тоже самое все.
&lt;many-to-one name="FkElement" column="FKElement" class="Diplom.Data.DataElement,Diplom.Data" /&gt; описание FK. Имя в классе. Имя в БД. И класс на который ключ ссылается.
В классе объекта хибера, все паблик методы должны быть виртуальными! В маппинге обрати внимание на &lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&gt; Должно быть именно 2.2. в нашей версии хибера.
В маппинге объектов &lt;class name="WindowsApplication2.Objects.DataElement,WindowsApplication2" table="DataElement"&gt; имя класса дается следующим образом: Полностью Namespace класса + имя класса, после запятой имя сборки. Так для всех указаний на классы.
Так же отмечу что шаблон немного надо подправить будет, который используется в МГ при генерировании объектов. Надеюсь проблем у вас при это не возникнет. Но если надо, могу выложить.
Ну вот в принципе небольшой пример по поводу того как начать быстро работать с хибером. Я рассказывал именно о том как начать быстро работать, а не о том как устроен хибер. Будут вопросы, всегда отвечу.)
Автор: Куповых Вадим






Просмотров: 4781

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную