-
Notifications
You must be signed in to change notification settings - Fork 8
Журналирование изменений
В библиотеках присутствует модуль(функциональность) которая записывает в специальный журнал все изменение производимые пользователем(или программой) с базой данных. Библиотека называется QS.HistoryLog.
Она содержит как код позволяющей записывает все изменения сделанные через Nhibernate, так и диалоги просмотра журнала для пользователя.
В базе данных проекта должны быть созданы следующие таблицы:
- history_changeset - Содержит набор изменений, то есть набор измененных объектов, созданных пользователем одновременно, например, при сохранении документа изменяются так же строки документа, может быть какие-то дополнительные данные. Все они входят в один набор. У набора есть поля: Пользователь выполнивший изменение и название единицы работы.
- history_changed_entities - Изменение одного объекта в базе данных. В одном наборе изменение может быть имено несколько объектов(сотрудник, документ). Объект может быть: Создан, Изменен, Удален.
- history_changes - Набор изменённых полей для объекта. Cодержит старое и новое значения поля.
При старте приложения нужно включить логирование:
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]
на класс доменной модели.
Обратите внимание, что на всех сохраняемых в базу полях желательно иметь атрибут с названием поля для пользователя [Display(Name = "название поля")]
. А на классах, для которых есть отдельный диалог редактирования, еще и атрибут Appellative с названием объекта в родительном падеже, для автоматического именования диалогов, редактирования.
Если нужно, чтобы изменения в каком-то техническом поле журналировались, на поле можно повесить атрибут [IgnoreHistoryTrace]
.