2013-10-22 65 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属性,该属性将为您提供所有属性的列表。由于它是一个新的入口,它们都是新的。