Narzędzia ORM są szeroko stosowane do wykonywania operacji na bazie danych. W tym artykule opiszę jak w prosty sposób użyć narzędzia NHibernate w projekcie ASP.NET Core.
Outbox pattern is simple, yet powerful tool. Let’s see how does it work and what are the consequences of applying it. With outbox, instead of sending a message over the wire to message broker, we save a message to our microservice database as part of current business transaction. This way we achieve internal consistency inside our service. No messages will be sent if a transaction is rolled back...
Sztuka programowania 1865 dni, 13 godzin temu 136 źrodło rozwiń
This article renders the previousones obsolete (which they already were at this point anyway). EF Core vs NHibernate: Preface EF Core has made a lot of progress and it took me quite a while ...
Recently I’ve had occasion to work much more than usually with NHibernate. This is a really great ORM and a very mature project, but when you make a mistake it informs you about that in a very generic way (in most cases). The problem that hunted me for a few days was the issue with field length constrains (which was caused by insufficient and inconsistent REST API validation). When there was a discrepancy between declared field length in NHibernate mapping and validation logic (or the vali...
Bazy danych i XML 2390 dni, 13 godzin, 28 minut temu 52 źrodło rozwiń
NHibernate wymaga od programisty, aby wszystkie Properties (właściwości) wewnątrz Enitity (encji / klasy POCO) były oznaczone słowem kluczowym virtual. Jak zrobić, aby automatycznie sprawdzać czy wszystkie properties spełniają wymagania? Wykorzystać Unit Testy!
Bazy danych i XML 3020 dni, 10 godzin, 53 minuty temu 74 źrodło rozwiń
Niedawno byłem zmuszony do powrotu do kodu, który kiedyś współtworzyłem. Musiałem dołożyć pewną w gruncie rzeczy drobną funkcjonalność. Nie sprawiło to mi większych problemów, ale samo obcowanie z tym kodem skłoniło mnie do refleksji. Dopiero porównując tamten kod (z którego byłem przecież dumny jak paw) z kodem dzisiejszym widzę różnicę (ciekawe co powiem za kilka lat o obecnym kodzie). Różnicę w sobie samym. Widzę jak przez ostatnie dwa lata się zmieniłem (ale to temat na inny post). Moją szczegó...
Sztuka programowania 3627 dni, 17 godzin, 47 minut temu 135 źrodło rozwiń
Usually when we need to retrieve data from database server, we write code which looks like that using (var session = DataAccesLayer.Instance.OpenSession()) { using (var transaction = session.BeginTransaction()) { var projects = session.QueryOver
nHibernate named queries Czasem wymagania biznesowe skłaniają programistów do tworzenia bardzo skomplikowanych powiązań między obiektami / zapytań. Aby mieć je w jakimś 'przewidywalnym miejscu a nie rozrzucone po kodzie możemy użyć w mappingu. Query jest niezależne od Class. from Subject s where s.Name like :name Wywołanie mogło by być w ten deseń: IQuery query = Session.GetNamedQuery("qSubjectByName"); query.SetParameter("name","SomeName"); var list = query.List(); Ale co jeśli...
Od pewnego czasu zamiast stosowania mapowań za pomocą plików XML zacząłem używać FluentNHibernate. Mimo początkowego sceptycznego podejścia przełamałem się, a dobitnie nastąpiło to wtedy, kiedy zacząłem używać konwencji. Jedną z fajniejszych, która odrazu spowodowała pozytywne nastawienie do FNH jest konwencja IIdConvention. Pozwala na zautomatyzowanie mapowania klucza głównego. Dlaczego? Od zawsze stosuję klucze pojedyncze oparte na typie int lub long, gdzie wartość jest wyliczana algorytmem hilo. Otóż ...
Architektura 4983 dni, 23 godziny, 41 minut temu 112 źrodło rozwiń
Celem mojego pierwszego wpisu dotyczącego NHibernate było krótkie wprowadzenie w świat tego ORM’a. Dziś przyszedł czas na trochę praktyki. Zaczniemy od prostej konfiguracji aplikacji (konsolowej), aby ta mogła połączyć się z bazą danych oraz automatycznie utworzyć w niej przykładową tabelę. Wykorzystamy do tego celu bibliotekę Fluent NHibernate, dzięki której, w przeciwieństwie do standardowej konfiguracji wykorzystującej pliki XML znanej z oryginalnego Hibernate’a, skonfigurujemy wszystko z poziomu kodu...
Bazy danych i XML 5041 dni, 19 godzin, 45 minut temu 176 źrodło rozwiń
Całkiem niedawno pojawiła się nowa wersja NHibernate oznaczona numerem 3. Informacje co, gdzie i jak uległo zmianie można oczywiście znaleźć na głównej stronie projektu. Mi z tych wszystkich nowości najbardziej przypadło do gustu nowe API do wykonywania zapytań czyli QueryOver. Ale zacznijmy od początku. Wykonując zapytanie do bazy danych z poziomu NHibernate 2 mieliśmy do dyspozycji 4 możliwości: wywołanie metod Get/Loadzapytanie HQLużycie Criteria APIzapytania SQL Każda z nich ma swoje unikalne za...
Podczas prac związanych ze statystykami zauważyłem, że przy okazji pisania kolejnych testów dla obiektów repozytoriów powielam kod odpowiedzialny za przygotowanie bazy SQLite. Jak nakazuje dobry obyczaj, powtarzający się kod należy wydzielić.
Od pewnego czasu odgrażałem się, że napiszę kilka zapytań przy użyciu NHibernate. Teraz nadszedł ten czas. Za materiał treningowy posłużą mi wcześniej opisywane statystyki. Metodyka pisania zapytań jest następująca: najpierw SQL, później zapytanie w NH. Ma to na celu pokazanie w jaki sposób można przekładać T-SQL na język zapytań NH (w tym przypadku Criteria API).
Przeglądając istniejący kod i planując utworzenie kolejnych obiektów repozytoriów doszedłem do wniosku, że warto zaoszczędzić sobie trochę czasu i napisać uniwersalny (na ile to możliwe) obiekt bazowy repozytorium. Obiekt ten powinien zawierać podstawowe metody manipulacji i dostępu do danych. Dużym ułatwieniem jest to, że wszystkie obiekty dziedziny dziedziczą po obiekcie Entity (przed refaktoringiem BaseEntity), który zawiera pole Id z bazy danych oraz ważną z punktu widzenia NH implementacje metod E...
Ostatnio wrzuci mnie w projekcik z którym z woli klienta dostęp do bazy realizowany jest z wykorzystaniem nHibernata Troche więc o nHibernacie aby nie umkneło na przyszłość. Na początek POCO = Plain Old CLR Object Czyli proste niezwiązane klasy zawierające zazwyczaj proste property. NHibernate nie wymaga nawet aby klasa była serializowalna wymaga jedynie domyślnego bezparametrowego konstruktora oraz publicznych property wyrażających asocjacje między klasami POCO. Klasy POCO są reprezenta...
Mapowanie relacji pomiędzy tabelami na asocjacje klas to dusza ORMow. To przy okazji najbardziej problematyczne zagadnienie. Zagadnienie relacji jest szerokie jak rzeka i nie sposób opisać wszystkich przypadków. Najważniejsze z mojego punktu widzenia jest jednak zrozumieć sedno sprawy, zrozumienia tego brakowało przy moich pierwszych próbach i przyznam że zjadło mi to wiele godzin. Dzięki zastosowaniu klas POCO możemy posługiwać się niedostępnymi dla modelu DataSetów kolekcjami i powiązaniami ...