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