Свободный NHibernate сущность HasMany коллекции различных типов подклассов - PullRequest
27 голосов
/ 12 июня 2009

Так что все работает хорошо с основным отображением дискриминатора. Я могу напрямую взаимодействовать с объектами A и B.

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

Это карты без драмы в отображении BaseType как

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

Проблема возникает, когда: в совокупности мы хотим сопоставить коллекции каждому подклассу

Использование картографирования, как показано ниже

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

Это, очевидно, не полные сопоставления, но это минимальная сумма, чтобы описать то, что я пытаюсь сделать. Элементы, добавленные в ACollection и BCollection, правильно сохраняются в каскадном режиме при сохранении Aggregate. Однако при получении агрегата возникает путаница в различении типов.

Я пробежал столько разных возможных решений, что уже не знаю, что не сработало. Я чувствую, что мне не нужно предоставлять пункт where для коллекций, но у меня просто не получается.

Любые подсказки приветствуются.

1 Ответ

1 голос
/ 05 ноября 2010

Ваше отображение выглядит странно, в частности, я думаю, оно должно выглядеть больше вот так

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

Сказав, что кажется, что метод устарел, вы должны вместо этого определить следующее (взято из Подклассы автоматического сопоставления :

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);
  }
} 

Не уверен, что это все исправит, я еще не столкнулся с вашим сценарием.

Редактировать : проблема также поднимается здесь , звучит больше как ошибка для меня

...