NHibernate i PostgreSQL

W poprzednim wpisie opisałem jak skonfigurować EntityFramework do pracy z PostgreSQL. Zobaczmy jak to wygląda w przypadku NHibernate, zrealizujmy ten sam przykład co w przypadku EntityFrameworka.

Pierwsze kroki są dokładnie takie same przygotowujemy bazę danych…

…i tworzymy aplikację konsolową.

  1. Otwórz Visual Studio
  2. Wybierz File -> New -> Project…
  3. Wybierz Console Application
  4. Nazwij projekt
  5. Wciśnij OK

Instalujemy potrzebne pakiety

NHibernate podobnie jak EntityFramework używa data providera Npgsql, więc korzystając z NuGeta instalujemy NHibernate i Npgsql.

W Visual Studio Express 2012:

  1. Wybierz Tools -> Library Package Manager -> Manage NuGet Packages for Solution…
  2. Wyszukaj NHibernate
  3. Zaznacz na liście znalezionych
  4. Wciśnij Install

Powtórz te kroki dla Npgsql.

 Konfigurujemy NHibernate

W głównym katalogu naszego projektu musimy stworzyć plik hibernate.cfg.xml i ustawić jego właściwość „Copy to Output Directory” na „Copy always”.

Przykładowe konfiguracje dla różnych baz danych są dystrybuowane razem z kodem źródłowym dostępne na GitHubie tutaj. Wybieramy konfigurację dla PostgreSQL-a poprawiamy connection_string i mamy:

Zwróć uwagę na linię 8, nie występuje ona w przykładowej konfiguracji – dodałem ją, aby widzieć co dzieje się między NHibernatem a bazą danych, wyświetla ona na konsoli wszystkie zapytania SQL. Szczególnie na początku pozwoli to lepiej zrozumieć co się dzieje.

Tworzymy Model

Stwórz klasy jak poniżej:

 Mapowanie modelu

NHibernate używa do mapowania modelu plików XML. Tworzymy w głównym katalogu naszego projektu katalog Mappings. W utworzonym katalogu tworzymy pliki: Author.hbm.xml i Book.hbm.xml zmieniamy również właściwość „Build Action” na „Embedded Resource.

Author.hbm.xml:

Book.hbm.xml:

Automatyczne tworzenie bazy danych

NHibernate posiada wbudowane narzędzie hbm2ddl, które umożliwia nam stworzenie bazy danych na podstawie modelu. Dzięki temu możemy pominąć ręczne tworzenie bazy danych opisane na początku tego wpisu.

Używa się go w taki sposób:

Kod w liniach 6-7 tworzy bazę danych w oparciu o konfigurację.

Sposób użycia

Mamy już przygotowanego NHibernate’a spróbujmy zaimplementować taki sam przykład jak we wpisie o Entity Frameworku. Przed wykonaniem operacji na bazie danych musimy stworzyć obiekt sesji w ramach, której będziemy działać, do jego tworzenia musimy stworzyć obiekt implementujący ISessionFactory:

Dodajmy zatem do bazy jakąś książkę:

Wyświetlmy jakie książki są w bazie:

Ups! „Diunę” napisał Frank Herbert a nie Brian, poprawmy to:

Gotowe 🙂

Kod źródłowy do tego przykładu można pobrać tutaj.

Porównanie do Entity Frameworka

Patrząc na ten prosty przykład od razu widać kilka zasadniczych różnic między NHibernatem a Entity Frameworkiem.

Największą różnicą jest sposób mapowania modelu – w Entity Frameworku zrobiliśmy całe mapowanie za pomocą atrybutów i kodu C#, w NHibernate musieliśmy tworzyć dodatkowe pliki XML, które zawierały mapowanie. Łatwiejsze i przyjemniejsze wydaje mi się podejście zaproponowane w Entity Frameworku. Istnieją rozszerzenia do NHibernate’a , które ułatwiają mapowanie, zajmę się nimi w kolejnych wpisach.

Kolejną różnicą jest to, że w Entity Frameworku operujemy w ramach DbContextu a w NHibernate w ramach sesji, którą tworzymy na podstawie wcześniej przygotowanej konfiguracji.

NHibernate wymusza na nas ręczne tworzenie transakcji, co jest przed nami ukryte w Entity Frameworku.

NHibernate posiada narzędzie hbm2ddl, które umożliwia nam np. tworzenie bazy danych na podstawie modelu. Więcej szczegółów na temat tego narzędzia pojawi się w następnych wpisach.