Журналирование изменений - 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].