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.
przez „błąd w sprawie dyskryminacji typ”, to znaczy, że oba zestawy wracają wszystkie typy? Niezależnie od ich dyskryminatora? –
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
I tak, aby odpowiedzieć bezpośrednio na twoje pytanie ... Myślę, że próbuje załadować wszystkie typy bez względu na dyskryminatora. – berko