Jakie są najczęstsze błędy i anty-wzorce, które popełniają programiści NHibernate? Wyjaśnij, dlaczego są to złe praktyki lub podaj link do zasobów do dalszego czytania.
Na przykład:
- Jednym z anty-wzorów wspólnych dla nowych programistów NHibernate jest stosowanie identyfikatorów / natywnych POID zamiast jednostek w stylu ORM. Przeczytaj więcej tutaj ...
nhibernate
Darius Kucinskas
źródło
źródło
Odpowiedzi:
Moje osobiste „często wyjaśniane” problemy:
Anty-Wzory
Mieszanie z odłączonymi obiektami (SaveOrUpdate lub Merge plus trochę niechlujnego kodu) zamiast korzystania z DTO. Im bardziej złożone są byty, tym bardziej skomplikowany jest kod. (Oznacza to również, że działa całkiem dobrze z trywialnymi bytami.) Ayende nazywa to również Wzorem Strippera i wyjaśnia problem enkapsulacji.
Niezrozumienie uporczywej ignorancji i pisanie aplikacji NH, jak w przypadku jawnego SQL. Objaw: wywołanie aktualizacji po zmianie obiektu, zastanawianie się, dlaczego zmiany są utrzymywane, nawet jeśli aktualizacja nie została wywołana, zastanawianie się, jak uniknąć zmian, które należy utrwalić.
Niezrozumienie transakcji i wzorca jednostki pracy . Częste anty-wzorce: transakcje niejawne, sesja na operację i sesja na aplikację. Trochę więcej czytania:
Wykorzystanie zdarzeń NH do wprowadzenia logiki aplikacji (np. Śledzenie zmian we wyzwalaczach wstawiania i aktualizacji)
Utwórz jedną klasę na tabelę . Niektórzy ludzie nie rozumieją OOD, inni nie rozumieją projektowania relacyjnego.
Błędy
użycie jeden do jednego zamiast wielu do jednego. Próbowałem to wyjaśnić w tej odpowiedzi .
Korzystanie z funkcji pobierania sprzężenia w połączeniu z SetMaxResult. Moje najnowsze odpowiedzi związane z tym tematem:
Pisanie jednostek zmieniających się . Gdy jednostka nie zwraca dokładnie wartości ustawionej przez NH, jest uważana za brudną i aktualizowana w każdej sesji. Na przykład: zastąpienie trwałej kolekcji NH w ustawieniach właściwości.
Może być więcej, następuje.
źródło
„ Wybierz problem N + 1 ”.
Tutaj kończy się wykonywanie wyboru A dla każdego obiektu, którym chcesz manipulować (N), i wyboru, aby uzyskać listę podmiotów (+1), zamiast pojedynczego wyboru wszystkich obiektów i ich atrybutów.
źródło
FluentNHibernate
źródło
Próbuję to wyodrębnić, aby później móc przejść do Entity Framework (lub czegoś innego).
Jest to o wiele, znacznie trudniejsze niż większość ludzi, którzy próbują to zrozumieć. Istnieje wiele różnic między nimi, które mogą cię potknąć w sposób, który czasami może być dość subtelny. Jest to również bardzo rzadkie, aby w końcu było potrzebne - do tego stopnia, że możesz skrupulatnie próbować wdrożyć go przez lata, zanim odkryjesz, że twoje podejście jest błędne.
Ponadto ogranicza korzystanie z całej gamy przydatnych i ważnych funkcji NHibernate, takich jak buforowanie drugiego poziomu, przechwytywanie, zarządzanie współbieżnością, śledzenie zmian, zapytania z wyprzedzeniem i tak dalej.
Gdyby naprawdę istniała uzasadniona potrzeba przełączania między NHibernate a Entity Framework, byłby aktywnie rozwijany projekt wspierający to na GitHub (być może coś podobnego do CommonServiceLocator) z wieloma współautorami i prośbami ściągania.
źródło