2017-01-11 15 views
1

Я внедрил журнал аудита для каждого действия, сделанного на сервере (добавлено, изменено и удалено). Проблема возникает в измененном, потому что я проверяю каждое свойство, которое было изменено, но некоторые свойства, которые я не хочу проверять. Пример: временная метка или другие. Это то, что я сделал, и работает отлично: 1) Я сделал еще SaveChanges метод() в DbContext 2)Реализация контрольной трассы C#

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); 
        } 
       } 
      }` 

Это код экстракт, не все несильно. Я мог бы сделать валидацию внутри, прося поля, которые я не хочу проверять, но, есть ли более тщательный способ сделать это? Возможно, добавление некоторых данных в классы или что-то еще. спасибо.

ответ

0

Для этого можно использовать атрибут [System.ComponentModel.DataAnnotations.Schema.NotMapped].

+0

Как? Какую DataAnnotation я должен использовать? Благодаря –

+0

Используйте это так: класс AuditLogDetailEntity { [System.ComponentModel.DataAnnotations.Schema.NotMapped] DateTime TimeStamp {получить; задавать; } // etc } – Simmetric

0

Вы можете создать настраиваемый атрибут

[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))) 
    { 
     //..... 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^