NHibernate добавить несопоставленный столбец в перехватчик

StackOverflow https://stackoverflow.com/questions/824316

  •  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 */ } 
}

Прежде чем написать перехватчик, я бы подумал написать триггер базы данных. Потому что с помощью перехватчика вы «загрязняете» ваш уровень доступа к данным. Это может сделать его нестабильным, и у вас могут возникнуть странные проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top