Ведение журнала транзакций nHibernate

Наше приложение использует nHibernate, и есть требование регистрировать все изменения в определенной таблице. Мне не нужно регистрировать все запросы, сгенерированные ORM, только данные и дату.

Например, предположим, что у меня есть сущность с именем Сотрудник:

public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
}

Единственное решение, которое я могу придумать, это вручную отслеживать изменения (новые, обновленные и удаленные объекты) и записывать эти данные в таблицу. Что-то вроде:

public void SaveEmployees(List<Employee> employees)
{
    employees.ForEach(x => {
        if (x.ID == 0) // add do LOG list as new
        else // add to LOG list as old
    });

    // save employees like usual
    // save LOG list
}

Это нетрудно сделать, даже с извлечением старых данных, чтобы увидеть, чего не хватает, но мне было интересно, есть ли лучший способ?


person dzenesiz    schedule 07.05.2019    source источник
comment
Как вы сказали, вы не хотите регистрировать запросы. На всякий случай, если вы выберете этот вариант, здесь объясняется, как это сделать.   -  person Amit Joshi    schedule 08.05.2019
comment
Журналы транзакций не имеют ничего общего с NHibernate. Вы спрашиваете об аудит и, как правило, это то, что вы делаете в базе данных, а не в инструменте ORM на стороне клиента. Все основные базы данных имеют механизмы аудита или отслеживания изменений, которые можно использовать для аудита изменений данных.   -  person Panagiotis Kanavos    schedule 08.05.2019
comment
На какую базу данных вы ориентируетесь? Например, в SQL Server вы можете использовать встроенную функцию аудита, вы можете использовать отслеживание изменений для периодического выбора и сохранения изменений или, в SQL Server 2017 и более поздних версиях, вы можете использовать временные таблицы для отслеживания изменений в таблице истории.   -  person Panagiotis Kanavos    schedule 08.05.2019


Ответы (1)


Я думаю, что Interceptor может дать вам то, что вам нужно. Вы можете использовать метод OnFlushDirty() или OnSave() для записи изменений. Документация здесь.

person David Osborne    schedule 08.05.2019