Свободное наследование NHibernate и на подкласс
У меня есть базовый класс и два дочерних элемента (A:Base и B:Base), и я хочу сопоставить их с двумя таблицами (таблица A и таблица B). Это возможно в Fluent NHibernate? Так что я:
public class Base
{
public virtual int Id {get;set;}
public virtual int IndexIn {get;set;}
public virtual Product Product {get;set;}
}
public class A : Base
{
public virtual string Value {get;set;}
}
public class B : Base
{
public virtual int Value {get;set;}
public virtual IList<Sequence> Sequences {get;set;}
}
Мое отображение:
public class BaseMap : ClassMap<Base>
{
public BaseMap()
{
Id(x => x.Id);
Map(x => x.IndexIn);
References(x => x.Product);
}
}
public class AMap : SubclassMap<A>
{
public AMap()
{
Map(x => x.Value);
}
}
public class BMap : SubclassMap<B>
{
public BMap()
{
Map(x => x.Value);
HasMany(x => x.Sequences);
}
}
Но в этом случае он создает три таблицы (A, B и Base). Это хорошо, но мне нужно уменьшить количество таблиц, поэтому я могу использовать поля Base в таблицах A и B. Обычно я хочу просто отобразить A и B как обычные классы (без использования наследования), но мне нужно иметь возможность добавить какой-то другой класс, где я могу иметь свойство:
public virtual IList<Base> ListofAandB {get;set;}
Если я удаляю определение BaseMap и просто отображаю A и B как ClassMap<>, я получаю сообщение об ошибке "Не удается найти определение карты для Base", если я пытаюсь использовать свойство, которое написано выше.
1 ответ
Вы не сможете отобразить свой ListOfAAndB
свойство, если ваше наследование присутствует только в вашем коде, а не в модели базы данных. Чтобы NHibernate отобразил это свойство так, как оно определено, вам понадобится Base
таблица в вашей базе данных.