Отображение NHibernate с иерархией классов, базовый класс которой абстрактный, а дискриминатор не является строкой - PullRequest
9 голосов
/ 28 ноября 2008

Вот классы модели домена:

public abstract class BaseClass
{
...
}

public class ChildClass : BaseClass
{
...
}

Обратите внимание, что родительский класс является абстрактным, и это то, что доставляет мне некоторые трудности, когда приходит время для отображения с беглым nhibernate. Мой дискриминатор - это байт (tinyint в БД). Поскольку это не строка, и мне не удается установить значение дискриминатора для базового класса, это не работает (взято из класса отображения для BaseClass):

DiscriminateSubClassesOnColumn<byte>("Type")
    .SubClass<ChildClass>()
    .IsIdentifiedBy((byte)OperationType.Plan)
    .MapSubClassColumns(p => { ... })

Я получаю сообщение об ошибке:

Метод инициализации класса UnitTest1.MyClassInitialize вызвал исключение. NHibernate.MappingException: NHibernate.MappingException: не удалось отформатировать значение дискриминатора в строке SQL объекта BaseClass ---> System.FormatException: входная строка была в неправильном формате ..

Следующий пост, кажется, объясняет, что происходит. Они дают решение с xml, но не с беглым nhibernate: http://forum.hibernate.org/viewtopic.php?t=974225

Спасибо за помощь.

1 Ответ

13 голосов
/ 28 ноября 2008

Я нашел обходной путь, но это похоже на патч ... Я добавил следующее в файл сопоставления:

SetAttribute("discriminator-value", "-1");

Кажется, что FNH предписывает не использовать строку (я думаю, что она использует имя класса) для абстрактного базового класса. Чтобы заставить его работать со значением -1, я также изменил свой тип дискриминатора с байта на sbyte.

Edit: Я пропустил это: это второй параметр DiscriminateSubClassesOnColumn, который принимает значение по умолчанию. Итак, правильный ответ на мой вопрос:

DiscriminateSubClassesOnColumn<sbyte>("Type", (sbyte)-1)
...