2013-10-22 100 views
0

保持溫和,如果我第一次沒有得到這個術語,我的第一篇文章很抱歉。審計實體框架操作

Entity Framework我需要寫一些審計代碼

我有一個上下文類繼承DbContext有我的數據庫。 SetInitializer和我的DbSets爲每個實體。

我也有一個覆蓋SaveChanges我在做審計。

有3個級別的審計,基本AllProperties每個實體都分配了一個不同的屬性,在這種情況下,我試圖做一個AllProperties審計。

本工程爲EntityState.Modified我在哪裏在foreach使用GetModifiedProperties寫爲每個屬性修改

但是我無法做同樣的EntityState.Added一個新的記錄,似乎沒有成爲一個相當於GetNewProperties我可以循環。

case AuditType.AllProperties: 
{ 
    if (entry.State == EntityState.Modified) 
    { 
    foreach (var propertyName in entry.GetModifiedProperties() 
     .Where(propertyName => propertyName != "Id" && propertyName != "RowVersion")) 
     { 
     var original = entry.OriginalValues; 
     var oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString(); 

     var current = entry.CurrentValues; 
     var newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString(); 

     //if (oldValue != newValue) // probably not necessary 
     //{ 

     AuditTrails.Add(new AuditTrail 
      { 
      DomainId = domainId, 
      Controller = "", 
      Action = "", 
      EntityType = entry.Entity.GetType().Name, 
      EntityId = entityId, 
      Property = propertyName, 
      Before = oldValue, 
      After = newValue 
      }); 
     } 
    } 
    else 
    { 

     AuditTrails.Add(new AuditTrail 
     { 
      DomainId = domainId, 
      Controller = "", 
      Action = "", 
      EntityType = entry.Entity.GetType().Name, 
      EntityId = entityId, 
      EntityValue = entry.Entity.ToString(), 
      Property = "", 
      Before = "", 
      After = entry.State.ToString() 
     }); 
} 

任何人都可以幫忙嗎?

+0

只是猜測對我的作品,但新的記錄,他們都將是新的屬性。那麼是否有GetAllProperties或GetProperties? [也許這會幫助](http://stackoverflow.com/questions/5851274/how-to-get-all-names-of-properties-in-an-entity) – musefan

回答

0

下面現在此刻

if (entry.State == EntityState.Added) 
        { 
         for (var i = 0; i < entry.CurrentValues.FieldCount; i++) 
         { 
          var propertyName = entry.CurrentValues.DataRecordInfo.FieldMetadata[i].FieldType.Name; 

          if (propertyName == "Id") continue; 
          if (propertyName == "RowVersion") continue; 

          AuditTrails.Add(new AuditTrail 
               { 
                DomainId = domainId, 
                Controller = "", 
                Action = entry.State.ToString(), 
                EntityType = entityType, 
                EntityId = entityId, 
                EntityValue = "", //entityValue, 
                Property = propertyName, 
                Before = "", 
                After = entry.CurrentValues[i].ToString(), 
               }); 
         } 
        } 
0

每當您致電entry.OriginalValues時,您都可以訪問PropertyNames屬性,該屬性將爲您提供所有屬性的列表。由於它是一個新的入口,它們都是新的。