воскресенье, 29 мая 2011 г.

Используем Fluent NHibernate с Oracle

Авторы позиционируют свой продукт как:
"Fluent, XML-less, compile safe, automated,convention-based mappings for NHibernate."

То есть в нашем проекте не будет xml. Совсем.
Скачать можно здесь: http://fluentnhibernate.org/

В этом посте расскажу как поднял.
Я использовал NuGet в VS2010. Понадобится пакет Fluent NHibernate (в моем случае версия 1.2.0.712). NuGet автоматически выкачает все зависимости.

Я предполагаю, что у вас уже есть:
  1. Некоторая база в Oracle Server.
  2. Установленные на клиентском компьютере Oracle ODAC или Oracle Client.
  3. Необходимые протестированные строки подключения.
Возьмем любую сущность, например фотоальбом, принадлежащий пользователю User и содержащий в себе фотографии Images (свойство Thumbnail не рассматривается):

Обратите внимание на то что мы используем private setter для Id, а так же для коллекций, которые инициализируются в конструкторе. Помимо этого все свойства помечены виртуальными, это необходимо для NHibernate.

Рассмотрим код для маппинга нашей сущности:
MappingNames представляет из себя мой статический класс со строковыми константами имен таблиц и колонок, используемых в БД, ибо эти значения используются в нескольких проектах.

Класс отображения надо унаследовать от обобщенного класса ClassMap<>.
Метод Id() отображает идентификаторы, которые, в нашем случае, генерируются выбранным sequence; Map() отображает соответствующие свойства (используя соглашение об именах свойств для отображения на поля БД, так же можно задавать вручную с помощью метода Column(string)); Reference() идентичено NHibernate'овскому many-to-one, HasMany() — one-to-many, в соответствующих сущностях эти свойства должны быть прописаны с точностью до наоборот.

Более подробно о методах маппинга вы можете прочитать в вики Fluent NHibernate.

Пример конфигурирования БД:
Далее, метод OpenSession() используется в репозиториях или в Dependency Injection

Не забывайте так же со всеми бинарниками таскать и соответствующие провайдеры драйверов, в моем случае (Oracle ODAC) — библиотека Oracle.DataAccess.dll. Надо выставлять в свойствах ее Reference: Copy Local = True. Пишите тесты, чтобы видеть что вообще работает.

Вот так компонент помогает избавиться от xml и сделать всю конфигурацию строго типизированной.

Вопросы?

Желаю гибкого коннекта.