2008-10-20 10 views
8

Chciałbym wiedzieć, czy istnieje sposób na wyłączenie automatycznego ładowania rekordów potomnych w nHilbernate (dla jednego: wiele relacji).nhibernate - wyłącz automatyczne leniwe ładowanie rekordów podrzędnych dla jednego do wielu relacjiihps

Możemy łatwo wyłączyć leniwy ładunek na obiektach, ale chcę wyłączyć automatyczne ładowanie (leniwe i nie leniwe). Chcę tylko załadować dane za pomocą zapytania (np. HQL lub kryteria)

Chciałbym jeszcze zdefiniować relację między rekordami potomka podrzędnego w pliku odwzorowania, aby ułatwić HQL i móc dołączyć do nadrzędnych obiektów podrzędnych, ale ja nie aby rekordy podrzędne były ładowane jako część rekordu nadrzędnego, chyba że zapytanie do rekordu nadrzędnego wyraźnie stwierdza, że ​​(przez chętne pobieranie itp.).

Przykład: Pobieranie rekordu działu z bazy danych nie powinno pobierać wszystkich rekordów pracowników z bazy danych, ponieważ może nigdy nie być potrzebne.

Jedną z opcji jest ustawienie kolekcji Pracownicy w Dziale jako leniwego obciążenia. Problem z tym podejściem polega na tym, że po przekazaniu obiektu do wywołującego interfejsu API może on "dotknąć" właściwości leniwego obciążenia i pobrać całą listę z bazy danych.

Próbowałem użyć "eksmisji" - aby odłączyć obiekt, ale wydaje się, że nie działa on cały czas i nie robi głębokiego eksmisji na obiekcie. Plus to typ leniwego typu obciążenia z klasą proxy, która gra spustoszenie później w kodzie, w którym próbujemy działać na obiekcie za pomocą odbicia i napotyka nieoczekiwany typ obiektu.

Jestem początkujący nHibernate, wszelkie wskazówki lub pomoc będą bardzo pomocne.

+0

Masz literówkę: Czy wyłączyć -> wyłączyć – Anthony

Odpowiedz

3

Z Twojej prośby możesz po prostu nie mapować z działu do pracowników, ani nie mieć w dziale działu pracowników. Oznaczałoby to, że musisz zawsze uzyskać bazę danych, aby znaleźć pracowników bazy danych.

Aplogies jeśli te przykłady kodu nie działają po wyjęciu z pudełka, nie jestem blisko kompilatora w momencie

Tak, klasa wydział może wyglądać tak:

public class Department 
{ 
    public int Id { get; protected set; } 
    public string Name { get; set; } 
    /* Equality and GetHashCode here */ 
} 

a urzędnik będzie wyglądać następująco:

public class Employee 
{ 
    public int Id { get; protected set; } 
    public Name Name { get; set; } 
    public Department Department { get; set; } 
    /* Equality and GetHashCode here */ 
} 

dowolnym momencie użytkownik chce znaleźć pracowników do działu, pan musiał zadzwonić:

/*...*/ 
session.CreateCriteria(typeof(Employee)) 
    .Add(Restrictions.Eq("Department", department) 
    .List<Employee>(); 

Po prostu dlatego, że twoja specyfikacja mówi, że "departamenty mają wielu pracowników", nie oznacza, że ​​musisz go odwzorować jako dwukierunkowe powiązanie. Jeśli uda Ci się zachować powiązane jednokierunkowe, możesz naprawdę uzyskać dostęp do danych również do latania.

Google "Domain Driven Design" Aggregate, lub patrz strona 125 książki Erica Evana na Domain Driven Design, aby uzyskać więcej informacji

-1

Możesz mieć leniwy atrybut w kolekcji. W tym przykładzie Departament ma n pracowników, jeśli włączone jest leniwy, pracownicy nie zostaną załadowani domyślnie po załadowaniu działu: http://www.nhforge.org/doc/nh/en/#collections-lazy

Możesz mieć zapytania, które jawnie ładują dział I pracowników razem. To jest opcja "pobierania": http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

+0

W przypadku, gdy zapytanie nie chcą sprowadzić pracowników w ogóle -the Problemem jest to, że pracownicy przypadkowo dostają się leniwie, jeśli api uzyskują dostęp do gettera. Może to być opór wydajności i jeśli istnieje sposób, aby to wyłączyć. W moim poście wspomniałem o kilku problemach, z jakimi miałem do czynienia podczas eksmisji obiektu – dotnetcoder

Powiązane problemy