NHibernate JOIN сопоставление не удается, когда сопоставленное поле перемещается в базовый класс

2

Имея два класса моделей со многими общими полями, я решил создать базовый класс, и оба они наследуют его.

Существующие классы моделей уже появились с классами карт.

Все общие поля, которые теперь унаследованы в дочерних классах, являются виртуальными, чтобы поддерживать NHibernate счастливым, и все они отображаются правильно, за исключением одного...

Это мой случай:

public class BaseClass : EntityBase<Guid>
{
   //This is not complaining 
   public virtual string Text { get; set; }

   //This is complaining
   public virtual Guid TouchGuid { get; set; }
}

public class A : BaseClass
{
    //inherited + specific stuff
}

public class B : BaseClass
{
    //inherited + specific stuff
}

Теперь это классы отображения:

public class AMap : ClassMapping<A>
{
    //Mapping the ID inherited from EntityBase class
    Id(x => x.Id, mapper =>
    {
        mapper.Generator(Generators.GuidComb);
        mapper.Column("Pk_MenuItemId");
    });

    //Mapping the common field inherited, doesn't complain !
    Property(x => x.Mnemonic);

    //This is the one which is complaining, keep in mind it was working
    //before creating the base class and move the TouchGuid property in it.
    Join("Touch", x =>
    {
        x.Key(k =>
        {
            k.Column("EntityId");
            k.ForeignKey("PK_AClassId");
            k.OnDelete(OnDeleteAction.Cascade);
            k.Unique(true);
        });
        x.Property(p => p.TouchGuid);
    });
}

public class BMap : ClassMapping<B>
{
    //Same map as for class A
}

Всякий раз, когда я запускаю программу, загрузка данных из этих классов (таблиц), не будет подтверждать, что не может найти столбец TouchGuid таблицы A, соответственно таблицу B, вот ошибка:

Изображение 174551

Да, есть общие данные между таблицами A и B, но я не могу изменить схему db, это добавит слишком много сложности.

Нужно ли мне также создавать таблицу для базового класса? Я хотел бы избежать создания новой таблицы, если это возможно.

Любые намеки на то, что может быть неправильным?

Спасибо !

Теги:
nhibernate
fluent-nhibernate-mapping

1 ответ

1
Лучший ответ

Я полагаю, что NHibernate предполагает схему БД с несколькими таблицами, поскольку по умолчанию используется режим неявного полиморфизма. Попробуйте установить полиморфизм = явный в сопоставлениях.

  • 0
    ОК, я понял! Если у меня есть только один дочерний элемент, например, только класс A, он будет отлично работать, но всякий раз, когда я создаю второго дочернего элемента, он терпит неудачу. Это имеет смысл для полиморфной вещи, но я не нашел способа установить ее в явном виде в беглом nhibernate, я попробовал Polymorphism.Explicit (); но слово полиморфизм, к сожалению, не существует в текущем контексте. Не могли бы вы добавить некоторый код, как установить явный полиморфизм в беглом nhibernate? Спасибо Джонас!
  • 0
    Я читал об этом, и кажется, что полиморфный может быть установлен явным только с отображениями XML, это так?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню