Реализация NHibernate IInterceptor (добавить свойства в таблицу БД, которой нет у исходного класса домена) - PullRequest
5 голосов
/ 18 ноября 2008

Как можно установить некоторые специальные значения столбца при обновлении / вставке сущностей через NHibernate без расширения классов домена с помощью специальных свойств?

Например: в моем случае я хотел бы получить объект и за мгновение до обновления / вставки БД добавить к этому объекту некоторую дополнительную информацию (например, идентификатор пользователя или имя компьютера) с помощью IInterceptor. Другими словами, я хотел бы добавить несколько столбцов в таблицу БД без указания новых свойств в классе исходного объекта. Нужно ли в этом случае настраивать / изменять / добавлять мой Object.hbm.xml или App.config?

Проблема в том, что я не могу изменить свои исходные объекты и базовые классы. Поэтому я должен выяснить, если возможно, добавить информацию в таблицу БД без изменения исходных объектов (даже без наследования от каких-либо базовых классов)

Пример:

Оригинальный объект имеет: FirstName ,LastName,Birthday,Address properties

Customer.hbm.xml имеет:

<property name="FirstName" column="FirstName" type="string" not-null="true" length="64" />
<property name="LastName" column="LastName" type="string" not-null="true" length="64" />
<property name="Birthday" column="Birthday" type="DateTime" not-null="true"  />
<property name="Address" column="Address" type="string" not-null="true"  />

В моем классе перехватчиков есть метод:

public bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)

в этот момент или даже, возможно, перед сохранением, я должен добавить в таблицу Customer DB дополнительные 2 столбца (например, Имя компьютера и Имя пользователя), чтобы параметры propertyNames[] и state[] не имели их с самого начала, так что это должно быть сделано на лету.

Моя таблица клиентов БД содержит все столбцы, которые я описал выше.

Спасибо.

1 Ответ

1 голос
/ 16 января 2013

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

Например, получите соответствующий PersistentClass из config.ClassMappings, затем добавьте в него свои свойства.

private void AddProperty(
        PersistentClass pc, 
        string propertyName, 
        string columnName, 
        IType dataType)
    {
        SimpleValue val = new SimpleValue(pc.Table);
        Column col = new Column(dataType, 0);
        col.Name = columnName;
        val.AddColumn(col);
        val.Type = dataType;
        Property prop = new Property(val);
        prop.IsUpdateable = true;
        prop.Name = propertyName;
        prop.PropertyAccessorName = "nosetter.camelcase";
        prop.Cascade = "none";
        pc.AddNewProperty(prop);
    }
...