NHibernate устанавливает свойства автоматически при сохранении - PullRequest
11 голосов
/ 20 июля 2009

Я использую DDD и NHibernate для сохранения объекта моего домена. В моей базе данных каждая таблица, связанная с сущностью, имеет четыре дополнительных столбца (CreatedBy, updatedBy, CreatedDate, updatedDate), используемых для отслеживания аудита. Я использую шаблон репозитория, который позволяет сохранять только совокупные корни. Когда NHibernate пытается сохранить сущности в совокупном корне, я получаю ошибку SQL DateTime, потому что у сущностей не установлены свойства аудита. Есть ли способ в NHibernate установить свойства объектов непосредственно перед сохранением?

Вот небольшой пример. У меня есть объект заказа, который является совокупным корнем. У меня также есть объекты OrderNote, которые являются детьми порядка. Когда я добавляю OrderNote в Order, а затем сохраняю Order, возникает исключение, поскольку для CreatedDate / updatedDate задано значение DateTime.MinValue, что приведет к переполнению SQL DateTime. Поскольку эти столбцы аудита являются частью постоянства и не связаны с проблемной областью, я не хочу, чтобы агрегатный корень заказа устанавливал эти свойства при добавлении заметки. Столбцы / свойства аудита должны быть известны только средой постоянства, а не доменом. Я хотел бы быть в состоянии сказать NHibernate, чтобы установить эти свойства при сохранении или обновлении. Есть ли способ сделать это?

Ответы [ 2 ]

11 голосов
/ 20 июля 2009

Перехватчики могут сделать это:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-interceptors (9.10, ссылка не всегда работает).

Вырезать / вставить из документа:

public class AuditInterceptor : IInterceptor
{
    ...

    public boolean OnSave(object entity,
                          object id,
                          object[] state,
                          string[] propertyNames,
                          IType[] types)
    {
        if ( entity is IAuditable )
        {
            for ( int i=0; i<propertyNames.Length; i++ )
            {
                if ( "CreateTimestamp" == propertyNames[i] )
                {
                    state[i] = DateTime.Now;
                    return true;
                }
            }
        }
        return false;
    }

}

OnFlushDirty () может использоваться для UpdateDate.

Вы хотите, чтобы каждый объект, имеющий CreatedDate / updatedDate, реализовал интерфейс, чтобы перехватчик мог проверить, должен ли он действовать (в представленном примере это IAuditable).


Редактировать

Только что заметил главу 11: Перехватчики и события. Вы можете наследовать от EmptyInterceptor, что упрощает работу, если вам нужно только переопределить некоторые методы.

Я никогда не использовал События.

1 голос
/ 20 июля 2009

Вы также можете взглянуть на систему управления версиями NHibernate, которая может помочь вам в вашем случае;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...