Свободный объект NHibernate имеет множество коллекций различных типов подклассов

Итак, с основным отображением дискриминатора все работает хорошо. Я могу напрямую взаимодействовать с объектами 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 для коллекций, но у меня что-то просто не работает.

Будем признательны за любые подсказки.


person berko    schedule 12.06.2009    source источник
comment
Под беспорядком по поводу различения типов вы имеете в виду, что оба набора возвращают все типы? Независимо от их дискриминатора?   -  person James Gregory    schedule 12.06.2009
comment
Я ушел с работы, поэтому не могу вспомнить точную ошибку. Что-то вроде «Не удалось загрузить объект типа EntityA, потому что он не соответствует указанному EntityB». Мы взломали предложение Where, используя строку в сопоставлении HasMany, которая фильтруется вручную через столбец дискриминатора. Я просто подумал, что тип будет «протекать», а решение о том, где будет выполняться, будет выполняться автоматически.   -  person berko    schedule 12.06.2009
comment
И да, чтобы ответить прямо на ваш вопрос ... Я думаю, что он пытается загрузить все типы независимо от дискриминатора.   -  person berko    schedule 12.06.2009
comment
Вам удалось найти решение этой проблемы? У нас была точно такая же проблема, и мы нашли только одно решение - добавить предложение where к отображению, как вы уже коснулись. например HasMany (x = ›x.ACollection) .Where ([Type] = 'TypeA'). AsSet (). Cascade.All (); Использование такой волшебной струны кажется далеко не идеальным.   -  person s1mm0t    schedule 07.05.2010
comment
Я также могу подтвердить эту проблему. Кто-нибудь нашел решение?   -  person mxmissile    schedule 14.10.2010
comment
Кажется, это любое сопоставление.   -  person Rail    schedule 22.10.2010
comment
Вы знаете, как решить эту проблему с помощью NHibernate HBM XML? Если нет, возможно, вы можете спросить о группе пользователей NHibernate? В любом случае было бы полезно, если бы вы могли экспортировать свою AutoPersistenceModel в HBM XML (WriteMappingsTo()), чтобы их можно было проверить. Возможно, FNH каким-то образом сопоставляет обе коллекции с одним и тем же типом; если да, то это ошибка в FNH.   -  person Asbjørn Ulsberg    schedule 28.10.2010


Ответы (1)


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

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

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

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

person Iain    schedule 05.11.2010