NHibernate добавить несопоставленный столбец в перехватчик - PullRequest
1 голос
/ 05 мая 2009

Я пытаюсь сохранить сопоставленную сущность с помощью 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);
    }
}

У кого-нибудь есть идеи, как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 05 мая 2009

Не могу сказать наверняка, поскольку я никогда не делал этого (как Стефан, я также предпочитаю просто добавить частное свойство), но вы можете просто добавить NHibernate.Type.BooleanType в массив types? 1003 *

List<IType> typeList = types.ToList();
typeList.Add(new BooleanType());
types = typesList.ToArray();

EDIT

Да, похоже, ты прав; типы имеют конструктор internal. Я покопался и нашел TypeFactory:

Приложения должны использовать статический методы и константы на NHibernate.NHibernateUtil, если IType по умолчанию достаточно хорош. Например, TypeFactory должен только использоваться, когда строка должна иметь длину 300 вместо 255. На этом этапе NHibernate.String не дает вам правильный IType. Вместо этого используйте TypeFactory.GetString (300) и сохраняйте локальная переменная, которая содержит ссылку на IType.

Так что похоже на то, что вы хотите NHibernateUtil:

Предоставляет доступ ко всему спектру Встроенные типы NHibernate. Я печатаю экземпляры могут быть использованы для привязки значений запросить параметры. Также завод для новых BLOB-объектов и Clobs.

typeList.Add(NHibernateUtil.Boolean);
1 голос
/ 05 мая 2009

Лично я бы не сделал это так сложно. Я бы добавил частное свойство и присвоил ему значение по умолчанию - готово. Вы также можете рассмотреть значение по умолчанию в базе данных, тогда вам больше ничего не нужно делать.

private virtual bool COM_HOLD 
{ 
  get { return false; } 
  set { /* make NH happy */ } 
}

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

...