2008-11-18 1 views
5

Как можно установить некоторые специальные значения столбца при обновлении/вставке объектов через NHibernate без расширения классов домена со специальными свойствами?Реализация NHibernate IInterceptor (добавить свойства к таблице DB, которой не принадлежит исходный класс домена)

Например: в моем случае я хотел бы получить объект и всего лишь мгновение перед обновлением/вставкой db добавить к этому объекту некоторую дополнительную информацию (например, идентификатор пользователя или имя компьютера) с помощью IInterceptor. Другими словами, я хотел бы добавить несколько столбцов в таблицу DB без указания новых свойств в классе исходного объекта. Должен ли я настраивать/изменять/добавлять к моему 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 БД дополнительные 2 колонки (Имя компьютера и имя пользователя, например), что propertyNames[] и state[] параметры Дон» t иметь их с самого начала, так что это должно выполняться «на лету».

Таблица MY DB Customer имеет все столбцы, которые я описал выше.

спасибо.

ответ

1

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

Ex, извлеките соответствующий 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); 
    } 
Смежные вопросы