3

对于审计日志记录目的,我在EF 4.1数据库优先方法中覆盖SaveChanges()方法。从实体框架中的ObjectStateEntry获取所有密钥及其值

我有所有ObjectStateEntry对象,我想知道是否可以从每个ObjectStateEntry获取所有的键和它们的值。

IEnumerable<ObjectStateEntry> changes = this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified); 
    foreach (ObjectStateEntry stateEntryEntity in changes) 
    { 
     if (!stateEntryEntity.IsRelationship && 
       stateEntryEntity.Entity != null && 
        !(stateEntryEntity.Entity is DBAudit)) 
     { 
      list<object , object> KeyValues = GetAllKeyValues(stateEntryEntity); 
      //Do log all keyvalues 
     } 
    } 

回答

7

我没有测试过,但这样的事情应该工作:

private Dictionary<string, object> GetAllKeyValues(ObjectStateEntry entry) 
{ 
    var keyValues = new Dictionary<string, object>(); 
    var currentValues = entry.CurrentValues; 
    for (int i = 0; i < currentValues.FieldCount; i++) 
    { 
     keyValues.Add(currentValues.GetName(i), currentValues.GetValue(i)); 
    } 
    return keyValues; 
} 
+0

谢谢,有没有什么办法可以检索主键和外键? – Mostafa 2012-01-16 11:27:39

3

尝试使用ObjectStateEntry.EntityKeyEntityKey.EntityKeyValues

var keyValues = stateEntityEntry.EntityKey.EntityKeyValues; 

返回的EntityKeyMember数组。然后可以使用KeyValue属性,它们分别返回stringobject

+0

EntityKey和EntityKeyValues都为null,所以它始终返回null – Mostafa 2012-01-16 07:04:44

+0

@Mostafa,对不起,我不确定为什么你为这些属性获得null。我只是尝试类似于你的代码,但使用'DbContext'。我需要做的唯一事情就是调用'DbContext'上的'ChangeTracker.DetectChanges()',并且在做完之后它确实使用'EntityKey.EntityKeyValues'获得了关键值。 – 2012-01-16 07:23:19

+0

我想你正在测试与自我跟踪实体生成器,因为我没有ChangeTracker方法在我的objectContext – Mostafa 2012-01-16 11:24:20