Реализация контрольного следа C#
Я внедрил журнал аудита для каждого действия, выполненного на сервере (добавлено, изменено и удалено). Проблема возникает в измененном, потому что я проверяю каждое свойство, которое было изменено, но некоторые свойства я не хочу проверять. Пример: метка времени или другие. Это то, что я сделал, и работает нормально: 1) Я сделал другой метод SaveChanges() в DBContext 2)
if (dbEntity.State == EntityState.Modified)
{
foreach (string propertyName in dbEntity.OriginalValues.PropertyNames)
{
if (!Equals(dbEntity.OriginalValues.GetValue<object>(propertyName), dbEntity.CurrentValues.GetValue<object>(propertyName)))
{
var log = new AuditLogDetailEntity()
{
Timestamp = timestamp,
Type = "M", // Modified
EntityName = tableName1,
PrimaryKeyValue = Convert.ToInt32(dbEntity.CurrentValues.GetValue<object>(primaryKeyName)),
PropertyName = propertyName,
OldValue = dbEntity.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntity.OriginalValues.GetValue<object>(propertyName).ToString(),
NewValue = dbEntity.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntity.CurrentValues.GetValue<object>(propertyName).ToString()
};
changesCollection.Add(log);
}
}
}`
Это фрагмент кода, а не вся функция. Я мог бы сделать проверку внутри, прося те поля, которые я не хочу проверять, но есть ли более тщательный способ сделать это? Может быть, добавление некоторых dataannotations в классах, или что-то еще.. спасибо.
2 ответа
Вы можете создать собственный атрибут
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class UnMappedAttribute : Attribute
{
}
А затем проверьте, есть ли у каждого свойства
foreach (string propertyName in dbEntity.OriginalValues.PropertyNames)
{
if(!dbEntity.Entity.GetType().GetCustomAttributes(typeof(UnMappedAttribute), true).Any())
{
continue;
}
if (!Equals(dbEntity.OriginalValues.GetValue<object>(propertyName), dbEntity.CurrentValues.GetValue<object>(propertyName)))
{
//.....
}
}
Для этого вы можете использовать атрибут [System.ComponentModel.DataAnnotations.Schema.NotMapped].