Реализация контрольного следа 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].

Другие вопросы по тегам