2009-06-12 17 views
27

A więc wszystko działa dobrze z podstawowym mapowaniem dyskryminacyjnym. Potrafię bezpośrednio oddziaływać z jednostkami A i B bez żadnych problemów.Fluent NHibernate entity HasMany kolekcje różnych typów podklas

public class BaseType {} 
public class EntityA : BaseType {} 
public class EntityB : BaseType {} 

odwzorowuje to bez dramatu w mapowaniu BaseType jak

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<BaseType>("A", m => { }) 
       .SubClass<BaseType>("B", m => { }); 

problem występuje, gdy: w agregacie chcemy zbiory map do każdej podklasy

Korzystanie mapowania jak poniżej

public class AggregateMap: BaseMap<Aggregate> 
{ 
     public AggregateMap() 
     { 
       HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All(); 
       HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();    
     } 
} 

Te oczywiście nie są pełnymi mapowaniami, ale są minimalną ilością do opisania tego, co próbuję. Elementy dodane do ACollection i BCollection są zachowywane poprawnie przez kaskadowanie, gdy zapisana jest Aggregate. Jednak po pobraniu kruszywa pojawia się zamieszanie związane z dyskryminacją typów.

Przeszedłem przez tak wiele różnych możliwych rozwiązań, że nie wiem już, co nie zadziałało. Uważam, że nie powinienem podawać klauzuli "gdzie" w kolekcjach, ale rzeczy po prostu nie działają dla mnie.

Wszelkie wskazówki będą mile widziane.

+0

przez „błąd w sprawie dyskryminacji typ”, to znaczy, że oba zestawy wracają wszystkie typy? Niezależnie od ich dyskryminatora? –

+0

Opuściłem pracę, więc nie pamiętam dokładnego błędu. Coś takiego jak "Nie można wczytać elementu typu EntityA, ponieważ nie jest ono zgodne z określonym EntityB". Zhackowaliśmy klauzulę Where za pomocą ciągu znaków na mapowaniu HasMany, który jest filtrowany ręcznie przez kolumnę dyskryminującą. Po prostu myślałem, że typ "przepłynie" i gdzie decyzja zostanie wykonana automatycznie. – berko

+0

I tak, aby odpowiedzieć bezpośrednio na twoje pytanie ... Myślę, że próbuje załadować wszystkie typy bez względu na dyskryminatora. – berko

Odpowiedz

1

możliwość mapowania wygląda dziwnie, zwłaszcza myślę, że powinno wyglądać więcej jak ten

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<EntityA>("A", m => { }) 
       .SubClass<EntityB>("B", m => { }); 

Mimo, że wydaje się, że metoda ta jest amortyzowane i należy zamiast definiować następujące (zaczerpnięte z Automapping Subclasses:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 

    DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class ChildMap : SubclassMap<Child> 
{ 
    public ChildMap() 
    { 
    Map(x => x.AnotherProperty); 
    } 
} 

Nie wiem, to będzie to naprawić chociaż jestem jeszcze spotkać swój scenariusz.

Edit: Problem jest również podniesiony here, brzmiące bardziej jak bug mnie

Powiązane problemy