3

監査ログの目的で、EF 4.1 Database-FirstアプローチでSaveChanges()メソッドをオーバーライドします。Entity Frameworkの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

3

ObjectStateEntry.EntityKeyEntityKey.EntityKeyValuesを使用してみてください:

var keyValues = stateEntityEntry.EntityKey.EntityKeyValues; 

EntityKeyMemberの配列を返します。 およびobjectをそれぞれ返すKeyおよびValueプロパティを使用できます。

+0

EntityKeyとEntityKeyValuesの両方がnullなので、常にNULLを返します。 – Mostafa

+0

@Mostafa、申し訳ありませんが、なぜこれらのプロパティで 'null'が返されるのか分かりません。私はちょうどあなたに似たコードを試みましたが、 'DbContext'を使用しました。私がする必要があったのは 'DbContext'で' ChangeTracker.DetectChanges() 'を呼び出すことでしたし、それを実行した後に' EntityKey.EntityKeyValues'を使ってキー値を取得しました。 –

+0

私は自分のobjectContextでChangeTrackerメソッドを持っていないので、Self-Tracing Entity Generatorでテストしているとします。 – Mostafa

関連する問題