Журналирование изменений - QualitySolution/QSProjects GitHub Wiki
В библиотеках присутствует модуль(функциональность) которая записывает в специальный журнал все изменение производимые пользователем(или программой) с базой данных. Библиотка называется QS.HistoryLog.
Она содержит как код позволяющей записывает все изменения сделаные через Nhibernate, так и диалоги просмотра журнала для пользователя.
Структура данных
В базе данных проекта должны быть созданы следующие таблицы:
- history_changeset - Содержит набор изменений, то есть набор измененных объектов созданных пользователем одновременно например, при сохранении документа, изменяются так же строки документа, может быть какие то дополнительные данные. Все они входят в один набор. У набора есть поля: Пользователь выполнившыие изменение и название единицы работы.
- history_changed_entities - Изменение одного объекта в базе данных. В одном наборе изменение может быть именено несколько объектов(сотрудник, документ). Объект может быть: Создан, Изменен, Удален.
- history_changes - Набор измененых полей для объекта, содержит, старое и новое значения поля.
Включение модуля
При старте приложения нужно включить логирование:
HistoryMain.Enable();
Добавить модуль в автофак:
builder.Register(cc => new ClassNamesBaseGtkViewResolver(
//....
typeof(HistoryView)
)).As<IGtkViewResolver>();
builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetAssembly(typeof(HistoryViewModel)))
.Where(t => t.IsAssignableTo<ViewModelBase>() && t.Name.EndsWith("ViewModel"))
.AsSelf();
Атрибуты объектов доменной модели
HistoryTrace
Чтобы изменения в объекте доменной модели журналировались достаточно просто добавить атрибут [HistoryTrace]
на класс доменой модели.
Обратите внимания что на всех сохраняемых в базу полях желательно иметь атрибут с названием поля для пользователя [Display(Name = "название поля")]
. А на классах для которых есть отдельный диалог редактирования еще и атрибут Appellative с названием объекта в родительном падеже, для автоматического именования диалогов, редактирования.
IgnoreHistoryTrace
Если нужно чтобы изменения в каком-то техническом поле журналировались на поле можно повесить атрибуть [IgnoreHistoryTrace]
.