2012-04-11 22 views
9

Mam określone zapytanie w moim kodzie, które musi być chętny do ładowania wszystkich powiązanych podmiotów (zarówno -> 1 FKs i -> N FKs), ponieważ kontekst zostanie usunięty zaraz po tym .EF Code First: Include nie działa na opcjonalny związek

Wykonałem ogólną metodę "zapytania", która trwa params Expression<Func<MyItem, object>>[] includes, a następnie wewnętrznie je łączy. Ta część działa dobrze.

Kwerenda wygląda następująco:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

Mapowanie dla nieruchomości nie działa (umieszczonym w konfiguracji SubChildNotWorking):

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

Ze wszystkich obejmuje tylko SubChildNotWorking robi” t rzeczywiście działa. Podczas sprawdzania za pomocą debuggera zwróconego obiektu widzę serwery proxy we wszystkich właściwościach. Otwarcie serwerów proxy daje mi poprawne dane dla wszystkich innych relacji, a "Obiekt kontekstu został już usunięty wyjątek" dla właściwości SubChildNotWorking.

Jedyną różnicą, jaką udało mi się zauważyć, jest to, że SubChildNotWorking jest zerowalną wartością FK (z kolumną zerowalną w konfiguracji DB i WithOptional w strukturze dbcontext), podczas gdy wszystkie pozostałe są nieopróżnialnymi wartościami FK skonfigurowanymi za pomocą opcji WithRequired.

Baza danych jest również starszym DB nie utworzonym przy użyciu Code First i nieprzestrzegającym jego konwencji. Właśnie dokonałem mapowania w DbContext. Wszystko inne działa dobrze.

Próbuję dowiedzieć się, czy chętne ładowanie nie działa na NFK, ale nie mogłem znaleźć żadnej dokumentacji na ten temat.

Czy to błąd, czy zamierzone zachowanie? Ale przede wszystkim, jak mam to rozwiązać?

Dzięki.

+0

Co się stanie, jeśli to tylko 'SubChildNotWorking' bez drugiego subchildren? Czy to działa? – Slauma

+0

Nie. To też nie działa. –

+1

Czy możesz sprawdzić, czy SQL wygląda poprawnie (z 'var sql = facade.Query (c => c.Childs.Select (x => x.SubChildNotWorking)). ToString();') i przetestuj zapytanie ręcznie w SSMS, jeśli zwraca oczekiwane wyniki wierszy. – Slauma

Odpowiedz

0

Czy można zdefiniować

[DataContract] 

na swojej klasie (podmiotów)? Jeśli tak, to nie zapomnij, aby opisywać swoje SubChild z

[DataMember] 

lub może skończyć załadowany, ale nie pokazuje się podczas wykonywania rozmowy wsiadać podmiotów.

0

Podczas pracy z metodą włączania, mówimy o gorliwym wzorze obciążenia. Elementy z relacją zostaną załadowane jako kolekcje. Dla każdego nie obojętnego klucza obcego, trywialna kolekcja zaczyna być pusta, ale dla niej pustych, nie ma. Na Code First możesz uczynić właściwość nawigacji wirtualną, ale to nie twoja sprawa. Można spróbować załadować go bezpośrednio od kontekstu, na przykład:

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

lub krótsza wersja:

context.EntitiesWithFKNullable.Load(); 
Powiązane problemy