Я использую Nhibernate с Быстрым, и я встречаюсь с проблемой с наследованием.
Здесь моя схема DB
Основа ТАБЛИЦЫ
ТАБЛИЦА T1
Мои файлы отображения:
public class BaseMap: ClassMap<BASE>
{
public BaseMap()
{
Id(x => x.Id, "IDBASE").GeneratedBy.Identity();
Map(x => x.Field1);
DiscriminateSubClassesOnColumn("TYPE");
}
}
public class T1Map: SubclassMap<T1>
{
public T1Map()
{
Table("T1");
KeyColumn("IDBASE");
DiscriminatorValue("T1");
Map(x => x.Field2).Not.Nullable();
Map(x => x.Field3).Not.Nullable();
}
}
Я использую FluentMappings вместо AutoMapping.
Здесь мои объекты:
public abstract class BASE
{
public virtual long IdBase{ get; set; }
public virtual string Field1 { get; set; }
}
public class T1: BASE
{
public virtual string Field2 { get; set; }
public virtual string Field3 { get; set; }
}
Объект T1 наследовался ОСНОВНОМУ объекту, проблема - когда я пытаюсь получить строку, NHibernate пытаются выбрать Field2 и Field3 на Базовой таблице, тогда как они должны быть выбраны на Таблице T1.
Я попробовал десятки взломов, но это все еще не работает, если бы кто-либо как идея это было бы очень полезно.
Большое спасибо.
Вы указываете дискриминатор, который подразумевает, что структура наследования должна быть иерархией таблица-класс; у вас не будет двух таблиц с этой настройкой, у вас будет одна таблица со всем содержимым (поэтому выбор попадает в одну и ту же таблицу для всех столбцов).
Если вы удалите вызов DiscriminateSubclassesOnColumn
, ваши сопоставления будут помещены в таблицу для каждого класса, так что вы получите желаемую структуру.
На самом деле мне действительно нужен DiscriminateSubclassesOnColumn
, поэтому я нашел другое решение, в моем унаследованном объекте я выполняю сопоставление с соединением следующим образом:
public class T1Map: SubclassMap<T1>
{
public T1Map()
{
Join("T1", y =>
{
y.KeyColumn("IDBASE");
y.Map(x => x.Field2).Not.Nullable();
y.Map(x => x.Field3).Not.Nullable();
});
}
}
И он отлично работает , Я могу сохранить столбец Дискриминатор в моем базовом классе.
Спасибо