NHibernate добавить несопоставленный столбец в перехватчик
-
05-07-2019 - |
Вопрос
Я пытаюсь сохранить сопоставленный объект с помощью NHibernate, но моя вставка в базу данных не удалась, поскольку в базовой таблице есть столбец, который не допускает нулевых значений и НЕ отображается в моем объекте домена.Причина, по которой он не отображается, заключается в том, что рассматриваемый столбец поддерживает устаревшее приложение и не имеет отношения к моему приложению, поэтому я бы не хотел загрязнять свою сущность устаревшим свойством.
Я знаю, что мог бы использовать частное поле внутри своего класса, но мне это все равно неприятно.у меня есть читать что я могу использовать перехватчик NHibernate и переопределить метод OnSave(), чтобы добавить новый столбец прямо перед сохранением моего объекта.Это оказывается сложно, поскольку я не могу понять, как добавить экземпляр Nhibernate.type.IType в параметр типов моего перехватчика OnSave.
Моя сущность примерно выглядит так:
public class Client
{
public virtual int Id { get; set; }
public virtual int ParentId { get; set; }
public virtual string Name { get; set; }
public virtual string Phone { get; set; }
public virtual string Email { get; set; }
public virtual string Url { get; set; }
}
И мой перехватчик
public class ClientInterceptor : EmptyInterceptor
{
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
if (entity is Client)
{
/*
manually add the COM_HOLD column to the Client entity
*/
List<string> pn_list = propertyNames.ToList();
pn_list.Add("COM_HOLD");
propertyNames = pn_list.ToArray();
List<Object> _state = state.ToList();
_state.Add(false);
state = _state.ToArray();
//somehow add an IType to types param ??
}
return base.OnSave(entity, id, state, propertyNames, types);
}
}
Есть ли у кого-нибудь идеи о том, как это сделать правильно?
Решение
Я не могу сказать наверняка, так как я никогда этого не делал (как и Стефан, я предпочитаю просто добавлять частную собственность), но можете ли вы просто добавить NHibernate.Type.BooleanType
к types
множество?
List<IType> typeList = types.ToList();
typeList.Add(new BooleanType());
types = typesList.ToArray();
РЕДАКТИРОВАТЬ
Да, похоже, вы правы;типы имеют internal
конструктор.Я немного покопался и нашел TypeFactory
:
Приложения должны использовать статические методы и константы на nhibernate.nhibernateutil, если Itype по умолчанию достаточно хорош.Например, TypeFactory следует использовать только тогда, когда строка должна иметь длину 300 вместо 255.Вместо этого используйте typefactory.getString (300) и сохраните локальную переменную, которая содержит ссылку на ITYPE.
Итак, похоже, что вы хотите NHibernateUtil
:
Обеспечивает доступ ко всему диапазону встроенных типов Nhibernate.Экземпляры ITYPE могут использоваться для привязки значений с параметрами запроса.Также фабрика для новых каплей и клобов.
typeList.Add(NHibernateUtil.Boolean);
Другие советы
Лично я бы не сделал это так сложно. Я бы добавил частное свойство и присвоил ему значение по умолчанию - готово. Вы также можете рассмотреть значение по умолчанию в базе данных, тогда вам больше ничего не нужно делать.
private virtual bool COM_HOLD
{
get { return false; }
set { /* make NH happy */ }
}
Прежде чем написать перехватчик, я бы подумал написать триггер базы данных. Потому что с помощью перехватчика вы «загрязняете» ваш уровень доступа к данным. Это может сделать его нестабильным, и у вас могут возникнуть странные проблемы.