2015-03-22 10 views
8

Mam następujący model:Abstrakcyjny typ X ma odwzorowanych potomków, a więc nie może być odwzorowany

public abstract class AbstractBase { } 
public abstract class AbstractBase<T> : AbstractBase where T : SomeOtherTypeBase 
{ 
    T MyProp {get; set;} 
} 
public class Concrete1 : AbstractBase<OtherTypeSpecializationFor1> { } 
public class Concrete2 : AbstractBase<OtherTypeSpecializationFor2> { } 

Ale Entity Framework daje mi błąd:

Abstrakcyjny typ AbstractBase ma żadnego odwzorowany potomków i tak nie można mapować

Moim zdaniem nie powinno to mieć miejsca, ponieważ AbstractBase bezpośrednio dziedziczy z AbstractBase i klas Concrete1/2, które są dziedziczone z klasy GenericAbstractBase. Co tu się dzieje ?

Ponadto, z czystej ciekawości, zastanawiam się, czy właściwość typu T w GenericAbstractBase będzie utrzymywana przez EF, na wypadek, gdyby ktoś przechodzący obok miał na myśli odpowiedź.

Update 1

Czy ktoś może potwierdzić, że ta jest obsługiwana przez EF? Widziałem to post i według odpowiedzi Rowan powinno tak być. Dziękuję

Update 2 sam problem, gdy rodzajowe klasa bazowa nie jest abstrakcyjna.

+0

to '' Concrete2' Concrete1' i faktycznie odwzorowanych w konfiguracji? –

+0

Tak, są, mam DbSets dla tych typów, a także wyraźnie je zarejestrowałem w OnModelCreating – reddy

+0

Myślę, że to może być duplikat http://stackoverflow.com/questions/12538004/entity-framework-5-the-abstract -type-x-ma-nie-mapował-potomków-i-tak-cann –

Odpowiedz

5

Oto odpowiedź from the EF Team:

EDM, podstawowe meta-model stosowany przez program EF6 rozumować o typy encji nie obsługuje rodzajowych. Zezwalamy na dodawanie nietypowych typów encji , które dziedziczą po typach ogólnych, do modeli , ale gdy wchodzimy w hierarchie dziedziczenia, przestajemy szukać , gdy tylko trafimy na ogólny przodek. Zwykle używa się tej zdolności do modelowania kształtu twoich typów jednostek przy użyciu pełnej ekspresji dziedziczenia i generycznych rzeczy po stronie CLR z rzeczy, jednak po stronie EF powoduje to dodawanie niepowiązanych typów jednostek .

W ten sposób zdefiniowałeś swój DbContext, z perspektywy środowiska wykonawczego EF6 dodajesz trzy różne i niepowiązane typy jednostek: AbstractBase, Concrete1 and Concrete2. Wszystkie typy ogólne w środku hierarchii zostały zignorowane, a zatem EF nie jest wiedzieć, że są one powiązane.

Z tym ograniczeniem, oczekiwanym wyjątkiem jest , ponieważ AbstractBase jest abstrakcyjny i nie ma żadnych konkretnych potomków znanych z EF. Jeśli dodać osobny nierodzajową i rodzaj betonu, która dziedziczy bezpośrednio od AbstractBase, np .:

public class ConcreteFork : AbstractBase { } 

Twój model powinien być ważny jeszcze raz. Jednak nie będzie można użyć MyContext.AbstractBases do ładowania zapytań, które zwracają instancje Concrete1 lub Concrete2, ponieważ EF nie jest świadomy faktu, że są one powiązane z nimi.

Nawiasem mówiąc, w EF7 pozbyliśmy warstwy EDM dla realizacji EF i oczekujemy, aby być w stanie obsługiwać coraz więcej scenariuszy rzeczywistych generycznych typów jednostek.

Mam nadzieję, że to pomoże wyjaśnić, co się dzieje.

Diego

-1

znalazłem rozwiązanie dostarczone przez Gil Fink w artykule CodeProject, Spreading Inheritance Tree Mapping Across Assemblies in Code First.

Rozwiązaniem problemu jest dodanie mapowania do wszystkich podmiotów w kontekście. Aby to zrobić, trzeba będzie zastąpić metodę OnModelCreating i mapować wszystkie podmioty:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Entity<AbstractBase>(); 
    modelBuilder.Entity<Concrete1>(); 
    modelBuilder.Entity<Concrete2>(); 
} 
Powiązane problemy