[nhibernate] [automapper] problem z relacjami

0

Cześć,

Mam problem z relacjami w nhibernate

Mam definicje klasy A, która ma zdefiniowanych kilka relacji (1:n, n:m)

żeby wysłać to do klienta stworzyłem odpowiadającą jej klasę DTO, do mapowania wykorzystuję Automappera (docelowo ma to iść za pomocą webserwisów).

Problem mam z tym, że w momencie mapowania ładowane są z bazy danych wszystkie relacje, a nie zawsze jest to potrzebne.

W jaki sposób to można najłatwiej obejść? Do głowy przychodzi mi tylko zdefiniowanie kilku klas DTO (bez relacji, z relacjami) dla pojedynczej klasy A i zdefiniować osobne mapowanie w Automapperze dla każdej z nich. Czy jest jakiś inny sposób?

0

Jak zgaduję relacjami nazywasz klucze obce, a problem polega na tym, że próbujesz tych samych klas zmapowanych na tabele używać do różnych celów. Czyli np. masz klasy (w nawiasach kolumny) K1 (A, B, C, D, E) i K2 (X, Y, Z), potrzebujesz raz pobrać dane o strukturze S1: K1.A, K1.B, K2.Y a raz S2: K1.C K1.D K1E , a tak naprawdę zawsze pobierane są wszystkie kolumny z tych tabel?
Pierwszym winowajcą tutaj chyba jest AutoMapper, który pewnie wymaga pobrania całych obiektów z bazy, a następnie mapuje je na Twoje wyjściowe obiekty. AutoMapper ma wsparcie dla robienia projekcji w EF, ale nie wiem czy dla NH również.
Ale mniejsza z tym, bo jeśli mam rację, to uprawiasz coś, co nazywa się "encja na twarz i pchasz", jest źródłem setek problemów i generalnie zabija całą produktywność i wydajność pracy z ORMem.

Rozwiązanie jest takie, jak napisałeś - napisać sobie oddzielne query modele do każdej faktycznie potrzebnej Ci struktury danych. I jeśli AutoMapper nie wspiera budowania projekcji dla NH, to zrób to za pomocą API NH, będzie na pewno wydajniej.

0

Dokładnie tak - próbuje tych samych klas używać do rożnych celów (element na liście, edycja itp)

Dane powiązane relacjami ładują mi się za pomocą lazyload, Automapper widzi że jest takie pole (właściwość) w obiekcie, a ponieważ jest to obiekt proxy nhinernate, w momencie próby pobrania danych jest generowanie zapytanie do BD i dane są ładowane.

Moim pomysłem było pozostawienie niezmienionych mapowań nhibernate, natomiast klasy na które ma być mapowany ma tylko te właściwości których potrzebuję: KlasaPodstawowa(Id, Nazwa), KlasaZRelacjaA(Id, Nazwa, ObektyKlasyA), KlasaZWszystkimiRelacjami(Id, Nazwa, ObiektyKlasyA, ObiektyKlasyB, ObiektyKlasyXYZ) .

Czy dobrze rozumiem - mówisz żeby zmienić definicje mapowań i tam zdefiniować te dane które potrzebuję?

0

Nie, mówię, żeby trzymać się SRP i mieć różne modele do różnych celów. Dokładnie tak, jak Ty chcesz. Tylko AutoMapper będzie tu prawdopodobnie przeszkadzał - w sensie też będzie ładował wszystkie powiązanie obiekty (powiązane obiekty, nie żadne relacje), tak jak to robi teraz.), Z tego powodu wolałbym sam podać odpowiednie projekcje (metodą IQueryOver.SetProjections) w momencie wykonywania zapytania.

0

Ok THX :)

To mi bardzo pomogło :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1