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
- Ź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/.
- FluentNHibernate dostarcza już pierwsze binarki dla wersji 3.x, które dostępne są na stronie projektu: http://fluentnhibernate.org/downloads.
- Łączymy się z bazą danych i wykonujemy skrypt tworzący schemat bazy danych wraz ze stowarzyszonymi elementami (skrypt northwind_create_script.sql).
- 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.
- 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.
- 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