2017-01-11 3 views
1

Ich implementierte ein Audit-Protokoll für jede Aktion auf dem Server (hinzugefügt, geändert und zu löschen). Das Problem tritt in der modifizierten, weil ich jede Eigenschaft, die geändert wurde, zu überprüfen, aber einige Eigenschaften, die ich nicht überprüfen möchte. Bsp: Zeitstempel oder andere. Das ist, was ich tat, und funktioniert gut: 1) ich noch Savechanges gemacht() -Methode in DbContext 2)Implementieren von Audit-Trail 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); 
        } 
       } 
      }` 

Dies ist ein Auszug Code, nicht alle funcion. Ich könnte eine Bestätigung im Inneren machen und nach Feldern fragen, die ich nicht prüfen möchte, aber, gibt es eine gründlichere Vorgehensweise? Vielleicht fügen Sie Datenannotationen in den Klassen oder etwas anderes .. danke.

Antwort

0

Sie können das Attribut [System.ComponentModel.DataAnnotations.Schema.NotMapped] dafür verwenden.

+0

Wie hat? Welche DataAnnotation sollte ich verwenden? Dank –

+0

es wie folgt verwendet: Klasse AuditLogDetailEntity { [System.ComponentModel.DataAnnotations.Schema.NotMapped] Datetime Timestamp {get; einstellen; } // usw. } – Simmetric

0

Sie eine benutzerdefinierte erstellen könnte Attribut

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class UnMappedAttribute : Attribute 
{ 
} 

Und dann prüfen, ob jede Eigenschaft es

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