2010-11-16 17 views
6

Nie mogłem znaleźć odpowiedzi na ten problem, więc zakładam, że jest to coś, co robię źle.Fluent NHibernate LazyLoad Issues

Mam PersistenceModel skonfigurować gdzie mam ustawić konwencję w następujący sposób: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

Jednak dla jednej z relacji HasManyToMany w jednym z moich jednostek chcę chętny ładowania odbędzie której jestem utworzenie w następujący sposób: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

Intuicyjnie spodziewam chętny ładowanie się odbyć jak ja nadpisanie domyślnego obciążenia leniwy, że mam określony jako konwencja, ale nadal leniwych obciążenia. Jeśli ustawię konwencję DefaultLazy, aby nigdy, a następnie ustawiać LazyLoad na indywidualnej relacji, to również nie działa.

Wszelkie pomysły?

Odpowiedz

9

Po ustawieniu funkcji Not.LazyLoad() należy poinformować NHibernate, aby wczytała elementy stowarzyszone po załadowaniu obiektu nadrzędnego. NHibernate zrobi to, wykonując kolejną selekcję w tabeli "Wiele osób w wielu", niezależnie od tego, czy masz dostęp do kolekcji Partnerów czy nie. NHibernate używa innego wyboru, ponieważ jest to domyślny tryb pobierania. Również chcesz zastąpić tryb pobierania w zapytaniu lub w mapowaniu. Aby to zrobić w mapowaniu, dodać następujące:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

Można też chcą zawierać „.Cascade.AllDeleteOrphan()”, jeśli chcesz NHibernate utrzymują nowy Affiliaites dodany do zbierania i usuwania osieroconych nich. Jeśli tego nie zrobisz, będziesz musiał jawnie wywołać session.Save (newAffiliate). W przeciwnym razie otrzymasz wyjątek TransientObjectException, gdy twoja kolekcja Afiliantów zawiera nowego Partnera.

+0

Przepraszamy, usunąłem części kodu, które uważałem za nieistotne. Mam również .FetchType.Join() i wyłączanie leniwego ładowania nadal nie działa. Jedynym sposobem na wyłączenie leniwego ładowania okazało się, że działa dla mnie to ustawienie konwencji. – Dotnet

+0

Dodałem konwencję DefaultLazy.Always(), a relacja HasManyToMany() poprawnie ładuje się, gdy zastosuje się metodę Fetch.Join(). Możesz pobrać moją próbkę z GitHub tutaj: https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ –

+0

W porządku, cóż, prawie naśladowałem twój kod w mojej sytuacji i nadal nie działał, więc muszę się bliżej przyjrzeć. Używam .ShowSql() w celu ustalenia, czy kwerendy zostały uruchomione leniwie lub niecierpliwie, które uważam za dokładne? – Dotnet

0

Może to być jedna głupia rzecz, o którą zapytasz, ale czy wykonałeś zapytanie wewnątrz swojej sesji? Powiedzieć,

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

miałem ten problem przed i wreszcie zrealizowane obiekty, które miałem z dostępem nie zostały zapytaliśmy przed wyrzuceniem sesji.

Powiązane problemy