NHibernate: сохранение подклассовой сущности в основной таблице (таблица для стратегии класса)
Это не вопрос, а только будущее... (потратил много времени, чтобы выяснить это)
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
public class B : A
{
public string Lastname { get; set; }
}
Mappings (Свободный NHibernate):
public class AMap : ClassMap<A>
{
Table("a");
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Name);
Map(x => x.Type);
DiscriminateSubClassesOnColumn<string>("Type")
.AlwaysSelectWithValue();
}
public class BMap : ClassMap<B>
{
DiscriminatorValue("BType");
Extends<A>();
Map(x => x.Lastname);
}
Сохранение объекта BMap приводит к исключению:
Исключение:
Error dehydrating property value for A.Lastname
Внутреннее исключение:
Invalid index 1 for this SqlParameterCollection with Count=1
Это неочевидное исключение говорит о том, что произошла некоторая неправильная конфигурация отображения. На самом деле "отборные" запросы работают довольно хорошо. Но "вставить в" (ISession.SaveOrUpdate) вызывает упомянутые ошибки.
FIX:
В классе AMap эта строка не нужна:
Map(x => x.Type);
После удаления этого персистера работает нормально
1 ответ
Тип не должен быть ни в классе, ни в качестве свойства, это просто детали реализации в базе данных для различения типов. Вместо Extends SubclassMap более подходит:
public class AMap : ClassMap<A>
{
Table("A");
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Name);
DiscriminateSubClassesOnColumn<string>("Type", "AType")
.AlwaysSelectWithValue();
}
public class BMap : SubclassMap<B>
{
DiscriminatorValue("BType");
Map(x => x.Lastname);
}