Журнал аудита NHibernate, который не вызывает “набор, не был обработан сбросом” ошибки

Ayende имеет статью о том, как реализовать простой журнал аудита для NHibernate (здесь) с помощью обработчиков событий.

К сожалению, как видно в комментариях, его реализация заставляет следующее исключение быть брошенным: набор xxx не был обработан сбросом ()

Проблема, кажется, неявный вызов к ToString на грязных свойствах, которые могут доставить неприятности, если грязное свойство является также отображенным объектом.

Я попробовал свое самое твердое для создания рабочей реализации, но без удачи.

Кто-либо знает о рабочем решении?

8
задан cbp 22 June 2010 в 06:22
поделиться

1 ответ

Это совсем непросто. Я написал что-то вроде этого, но это очень специфично для наших нужд и нетривиально.

Некоторые дополнительные подсказки:

Вы можете проверить, загружаются ли ссылки, используя

NHibernateUtil.IsInitialized(entity)

или

NHibernateUtil.IsPropertyInitialized(entity, propertyName)

. Вы можете приводить коллекции к IPersistentCollection . Я реализовал IInterceptor , где я получаю тип NHibernate для каждого свойства, я не знаю, где вы можете получить это при использовании событий:

if (nhtype.IsCollectionType)
{
    var collection = previousValue as NHibernate.Collection.IPersistentCollection;
    if (collection != null)
    {
        // just skip uninitialized collections
        if (!collection.WasInitialized)
        {
            // skip
        }
        else
        {
            // read collections previous values
            previousValue = collection.StoredSnapshot;
        }
    }
}

Когда вы получаете событие обновления от NHibernate, экземпляр инициализируется . Вы можете безопасно обращаться к свойствам примитивных типов. Если вы хотите использовать ToString , убедитесь, что ваша реализация ToString не имеет доступа ни к ссылочным сущностям, ни к каким-либо коллекциям.

Вы можете использовать метаданные NHibernate, чтобы узнать, отображается ли тип как объект или нет. Это может быть полезно для навигации по вашей объектной модели. Когда вы ссылаетесь на другую сущность, вы получите дополнительные события обновления, когда она изменится.

4
ответ дан 5 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: