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);
}
Другие вопросы по тегам