Kamil Kliczbor @ asptip.net

27Dec/100

NHibernate 3.x i FluentNHibernate: Płynne mapowanie – Północny wiatr (Northwind)

Wprowadzenie

Celem niniejszego wpisu jest wykonanie mapowania bazy danych Northwind przy użyciu ORM-a jakim jest NHibernate w wersji 3.x. Dodatkowo, zamiast pisać xml-e konfiguracyjne posłużymy się FluentNHibernate. Model domenowy będzie stanowić całkiem niezłe podwaliny pod serię artykułów na temat pisania dedykowanych zapytań, które chcę popełnić w niedalekiej przyszłości. Za zgodą Davy Briona zmieniłem mapowania lekko zmodyfikowanej, myślę że również oklepanej bazy danych Northwind. Oryginalny projekt wraz z objaśnieniami można znaleźć pod adresem http://davybrion.com/blog/2007/07/nhibernate-mapping-examples/.

W międzyczasie chciałem iść troszeczkę na łatwiznę i zabawić się z generatorem MyGeneration. Niestety do Fluenta jeszcze nie ma szablonu :(. Wprawdzie do mapowań w xmlu dobry jest szablon o nazwie L-99, jednakże przerobienie go na wersję generującą płynne mapowania byłoby czasochłonne, więc odłożę tą pracę  na później :)

Wymagania

Do przebrnięcia przez artykuł potrzebne będzie Visual Studio co najmniej 2008 oraz co najmniej Ms Sql Server Express 2005.

Mapujemy!

W poniższych kilku krokach postaram się w miarę zwięźle przedstawić procedurę przenoszenia modelu relacyjnego z bazy danych na encje w postaci mapowań do NHibernate. Ponieważ projekt Davy'ego był dla starszej wersji NHibernate (1.2), wypadałoby uaktualnić ją do nowszej - 3.x

  1. Źródła do NHibernate wraz z towarzyszącymi bibliotekami log4neta oraz  proxy znajdują się w repozytorium na sourceforgu: http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0.GA/.
  2. FluentNHibernate dostarcza już pierwsze binarki dla wersji 3.x, które dostępne są na stronie projektu: http://fluentnhibernate.org/downloads.
  3. Łączymy się z bazą danych i wykonujemy skrypt tworzący schemat bazy danych wraz ze stowarzyszonymi elementami (skrypt northwind_create_script.sql).
  4. Otwieramy projekt Davy'ego i modyfikujemy go:
    • Usuwamy wszystkie pliki mapowań (z rozszerzeniem *.hbm.xml), albo ustawiamy we wszystkich "Build Action" na "None"
    • Konfigurujemy ustawienia połączenia z bazą danych
    • W projekcie Domain dodajemy katalog Mappings oraz tworzymy odpowiednie mapowania.
  5. W temacie mapowań nie będę się rozpisywał. Zachęcam do przeglądnięcia dokumentacji Fluenta. W celu weryfikacji możemy ewentualnie porównać pliki hbm-ów wygenerowanych przez Fluenta  z tymi Davy'a.
  6. Uruchamiamy testy.

Warto wspomnieć również o przyjętych konwencjach Fluenta. Można zdefiniować, aby domyślnie każdy identyfikator encji miał jeden spójny sposób mapowania. Realizuje się to poprzez implementację interfejsu IIdConvention , a następnie wskazanie na tą konwencję podczas konfiguracji. Oczywiście nic nie stoi na przeszkodzie, aby konwencję nadpisać w mapowaniu konkretnej encji.

public class IdentityConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Access.ReadOnlyPropertyThroughLowerCaseField(LowerCasePrefix.Underscore);
        instance.UnsavedValue("-1");
        instance.GeneratedBy.Native();
    }
}

Gotowy projekt jest do pobrania tutaj.

IIdConvention