nHibernate a Entity Framework

nHibernate a Entity Framework
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

Ostatnio natknąłem się na projekt napisany w ASP.NET MVC, który jako ORM zamiast korzystać z Entity Framework korzysta z nHibernate. Wg mnie jest to kiepski pomysł, ponieważ z tego co widzę to w nHibernate nie możliwości generowania migracji, co powoduje, że jak w projekcie pracuje wielu programistów to zarządzanie stanem bazy staje się uciążliwe. A co wy o tym sądzicie? Jest sens używać nHibernate czy tylko Entity Framework?

AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
1

Nie znam nhibernate ale ef daje możliwości o których piszesz, myślę, że nhibernate ma podobne, ef to kupa i tyle w temacie...

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około godziny
  • Postów:5107
1

Uważaj, bo grasuje tu taki jeden degenerat od nH...

A tak na serio, to:

https://stackify.com/entity-framework-core-nhibernate/

Najważniejszy argument za nH to chyba obsługiwane db.

edytowany 2x, ostatnio: WeiXiao
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Wrocław
4
Mikilll napisał(a):

Wg mnie jest to kiepski pomysł, ponieważ z tego co widzę to w nHibernate nie możliwości generowania migracji, co powoduje, że jak w projekcie pracuje wielu programistów to zarządzanie stanem bazy staje się uciążliwe.

Mnie się wydaje, że to jest problem albo z programistami albo z architekturą. Po pierwsze jest wbudowana metoda SchemaUpdate, po drugie doinstalowanie paczki obsługującej migracje z NuGeta chyba nie powinno być dużym utrudnieniem.

A co wy o tym sądzicie? Jest sens używać nHibernate czy tylko Entity Framework?

Nie no, pewnie, że lepiej używać tego ORMa, który nie ma cache drugiego poziomu, nie potrafi generować id, nie obsługuje różnych rodzajów kolekcji, nie daje żadnej kontroli nad generowanym SQL, nie pozwala na wysyłanie kilku zapytań w ramach jednego polecenia, i nie ma prawie żadnych możliwości rozszerzania. Tylko EF!


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Zobacz pozostałe 4 komentarze
SO
O ile dobrze pamiętam to EF Core wspiera różne rodzaje kolekcji i wysyłanie kilku zapytań w ramach jednego polecenia (to ma na 100%)
somekind
@some_ONE: ale tu chyba nie o Core mowa. @WeiXiao: nie, programiści EF umieją tylko EF, nawet paczki z NuGeta nie potrafią ściągnąć. Jeśli coś nie przyszło z VS, to jest zakazane.
WeiXiao
@somekind: nie załapałeś :< Programiści EF(C), że goście piszący EF(C). :)
somekind
Rozumiem. A programiści C#, to programiści piszący C#. ;]
WeiXiao
@somekind: Nie wiedziałem, że C# i EF to ta sama kategoria, a zatem kim są np. "Programiści Chrome(Browser)"?
._.
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
2

z tego co widzę to w nHibernate nie możliwości generowania migracji,

Może jesteś ślepy.

NH oferuje o wiele więcej, jeśli chodzi tworzenie zapytań i rozszerzanie jego funkcjonalności.
W EF zapis relacji związkach wiele do wiele to jakaś tragedia, musisz to wiązać identyfikatorami robić jakieś wspólne obiekty typu ProductCategory.

Zobacz pozostałe 13 komentarzy
somekind
Programista nie może mieć problemu z przeczytaniem dokumentacji i użyciem dowolnej biblioteki. Jeśli ktoś ma z tym problem, to się na programistę nie nadaje. A xmlki to produkt Twojej wyobraźni, w ogóle niezwiązany z rzeczywistością. Nie wiem o co z nimi chodzi, ale też nie wnikam, bo nie jestem specjalistą z tej dziedziny.
WeiXiao
@somekind: 1 link z google nhibernate: Object/relational mappings are defined in an XML document.
somekind
Co nie znaczy, że trzeba je pisać ręcznie. Od wielu lat nie ma takiej potrzeby.
czubeka2
Osobiście w nhibernate nie mam styczności z xml-ami, ponieważ wykorzystuję fluent mapping. Szczerze? Nie narzekam
grzesiek51114
grzesiek51114
XML'a od dawna nie trzeba uzupełniać w NH. Z drugiej strony fluent API jest w Entyty Frejmłorku też całkiem ok.
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
2

Niestety... choćbym nie wiem jak chwalił NH i jego przewagę nad EF to trzeba zdać sobie sprawę z faktu, iż na polskim rynku praktycznie nie istnieje. Ucząc się NH robi się z siebie swego rodzaju ekscentryka, który sunie pod prąd obecnych trendów. Trzeba zdać sobie z tego sprawę.

Dla tych co tak chwalą EF: spróbujcie zrobić RIGHT JOIN. ;-)

edytowany 3x, ostatnio: grzesiek51114
somekind
Może zatem lepiej omijać polski rynek pracy. ;)
grzesiek51114
grzesiek51114
Pamiętam, czytałem jakiś czas temu pewien artykuł, bardzo stary. Autor zastanawiał się jaka przyszłość czeka EF i czy przegoni popularne NH. Wyobrażacie sobie? ;)
AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
2

.AsNoTracking najbardziej użyteczne w EF!!! ;-) ;-)

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
somekind napisał(a):
Mikilll napisał(a):

Wg mnie jest to kiepski pomysł, ponieważ z tego co widzę to w nHibernate nie możliwości generowania migracji, co powoduje, że jak w projekcie pracuje wielu programistów to zarządzanie stanem bazy staje się uciążliwe.

Mnie się wydaje, że to jest problem albo z programistami albo z architekturą. Po pierwsze jest wbudowana metoda SchemaUpdate, po drugie doinstalowanie paczki obsługującej migracje z NuGeta chyba nie powinno być dużym utrudnieniem.

W Entity Framework jeżeli inny programista zmieni stan bazy i wygeneruje migracje to drugi programista może wykonać w konsoli "Update-Database" i zaaktualizować swój stan bazy. Czy serio nHibernate daje taką możliwośc? Szukałem trochę w Internecie i nie znalazłem za bardzo żadnego popularnego toola do nHibernate, który by ogarniał takie rzeczy. W Entity Framework jest to od razu wbudowane.

._.
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
1

A po co wam te ORM'y, zamiast opierać się na lazy loading lepiej jest napisać wyspecyfikowane zapytanie. Jeśli potrzebujesz cache pierwszego poziomu to prawdopodobnie robisz coś dziwnego, bo jak wyjaśnić odpytywanie dwa razy o to samo w jednym lifecycle sesji. Cache drugiego poziomu i tak nikt nie używa a przecież silnik bazodanowy ma wbudowany sam w sobie cache. Prawdziwe hardcore piszą stringi do sql'a i wszystko ręcznie mapują.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Wrocław
1
Mikilll napisał(a):

W Entity Framework jeżeli inny programista zmieni stan bazy i wygeneruje migracje to drugi programista może wykonać w konsoli "Update-Database" i zaaktualizować swój stan bazy. Czy serio nHibernate daje taką możliwośc? Szukałem trochę w Internecie i nie znalazłem za bardzo żadnego popularnego toola do nHibernate, który by ogarniał takie rzeczy. W Entity Framework jest to od razu wbudowane.

SchemaUpdate też jest wbudowane w NHibernate. To działa inaczej niż migracje w EF (nie masz wielu "etapów"), ale jak dla mnie efekt jest ten sam.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
1

Przerabialem już w życiu kilka technologii, najlepsza to był specjalizowany język i dedykowana do niego baza ( OpenEdge). W związku z tym każdemu jestem w stanie złożyć ukłon jeśli pozbawi mnie możliwości pisania stringów SQL do bazy!!! ORMy jednak sobie z tym radzą?! Mechanizm aktualizacji bazy danych w EF załatwione kompleksowo przez wbudowane mechanizmy. Jest parę tematów z których można skorzystać w EF i daje to jakiś pozytyw, ale nie jest to wspaniałe narzędzie i to chyba na tyle.

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
somekind napisał(a):
Mikilll napisał(a):

W Entity Framework jeżeli inny programista zmieni stan bazy i wygeneruje migracje to drugi programista może wykonać w konsoli "Update-Database" i zaaktualizować swój stan bazy. Czy serio nHibernate daje taką możliwośc? Szukałem trochę w Internecie i nie znalazłem za bardzo żadnego popularnego toola do nHibernate, który by ogarniał takie rzeczy. W Entity Framework jest to od razu wbudowane.

SchemaUpdate też jest wbudowane w NHibernate. To działa inaczej niż migracje w EF (nie masz wielu "etapów"), ale jak dla mnie efekt jest ten sam.

  1. Gdzie jest jakaś oficjalna dokumentacja do SchemaUpdate w nHibernate, bo naprawdę nie mogę nic znaleźć sensownego w Internecie?
  2. Czy działa to tak jak w Entity Framework, że wpisuje się komendy w konsoli?
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Czy działa to tak jak w Entity Framework, że wpisuje się komendy w konsoli?

Odnoszę wrażenie, że bardzo chciałbyś by NH był jak EF. Otóż tak nie jest. Są to dwa, całkowicie różne konceptualnie ORM'y.

W NH niczego nie wpisuje się w konsoli. Przy odpowiedniej konfiguracji aktualizacja bazy na podstawie encji przebiega automatycznie i nie trzeba bawić się w konsolę.

Wersjonowanie aplikacji można ładnie zapiąć w metody, które po prostu propagują zmiany, a sama baza aktualizuje się automagicznie.

edytowany 1x, ostatnio: grzesiek51114
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
grzesiek51114 napisał(a):

Czy działa to tak jak w Entity Framework, że wpisuje się komendy w konsoli?

Odnoszę wrażenie, że bardzo chciałbyś by NH był jak EF. Otóż tak nie jest. Są to dwa, całkowicie różne konceptualnie ORM'y.

W NH niczego nie wpisuje się w konsoli. Przy odpowiedniej konfiguracji aktualizacja bazy na podstawie encji przebiega automatycznie i nie trzeba bawić się w konsolę.

Wersjonowanie aplikacji można ładnie zapiąć w metody, które po prostu propagują zmiany, a sama baza aktualizuje się automagicznie.

Automatycznie? Czyli co jak np. kolega zmieni schemat bazy, a ja przełącze się na jego commita w Gicie?

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Skąd mam wiedzieć? :) Nie pracowałem grupowo w projekcie z NH to nie wiem, a i samego ORM'a widziałem ostatnio może... 7mieś. temu. :)

Pamiętam za to, że takie rzeczy ustawia się podczas konfigurowania SessionFactory, zwyczajnie dopisując SchemaUpdate do łańcuszka metod. Czy jakoś tak, 7mieś. przerwy od ORM'ów robi swoje.

edytowany 3x, ostatnio: grzesiek51114
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Wrocław
0
Mikilll napisał(a):

Automatycznie? Czyli co jak np. kolega zmieni schemat bazy, a ja przełącze się na jego commita w Gicie?

To odpalisz konsolową apkę, którą masz w solucji, a która wywoła SchemaUpdate na konfiguracji NH ze zmianami wprowadzonymi przez kolegę.
A jak nie masz tej apki w solucji, to należy wrócić do mojego pierwszego posta - jest jakiś problem z architekturą.

Ja mam wrażenie, że Ty pierwszy raz w życiu zobaczyłeś tramwaj i twierdzisz, że to nie może jechać, bo nie ma gdzie wlać benzyny.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
._.
To wygląda jakby się integrowali bazą zamiast API.
somekind
Integracja w bazie to problem podczas życia aplikacji, jak rozumiem autor ma tu problem z fazą developmentu.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)