Skip to content

Журналирование изменений

Иван edited this page Aug 11, 2025 · 4 revisions

В библиотеках присутствует модуль(функциональность) которая записывает в специальный журнал все изменение производимые пользователем(или программой) с базой данных. Библиотека называется 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

Чтобы изменения в объекте доменной модели журналировались, достаточно просто добавить атрибут [HistoryTrace] на класс доменной модели.

Обратите внимание, что на всех сохраняемых в базу полях желательно иметь атрибут с названием поля для пользователя [Display(Name = "название поля")]. А на классах, для которых есть отдельный диалог редактирования, еще и атрибут Appellative с названием объекта в родительном падеже, для автоматического именования диалогов, редактирования.

IgnoreHistoryTrace

Если нужно, чтобы изменения в каком-то техническом поле журналировались, на поле можно повесить атрибут [IgnoreHistoryTrace].

Clone this wiki locally