2017-06-07 5 views
2

DbContextクラスのSaveChanges()メソッドをオーバーライドしようとしています。これは、エンティティの名前を追加、削除または更新してエンティティの名前を取得しようとしているためです。行のそれぞれのIDと実行されたアクション。Entity Framework 6.1.3でSaveChangesを呼び出すときにエンティティ名を取得

私はこれを行う方法がわかりません。

これはログのアクションの目的で使用します。

あらかじめご挨拶ください。

答えて

4

あなたは私たちがエンティティを取得するために変更トラッカAPIを照会しているDbContextのSaveChangesメソッドをオーバーライドして、それが上記のスニペットではdatabase.public

public class ChangeLog 
{ 
    public string EntityName { get; set; } 
    public string PropertyName { get; set; } 
    public string OldValue { get; set; } 
    public string NewValue { get; set; } 
} 

public override int SaveChanges() 
{ 
    var modifiedEntities = ChangeTracker.Entries() 
     .Where(p => p.State == EntityState.Modified).ToList(); 

    foreach (var change in modifiedEntities) 
    { 
     var entityName = change.Entity.GetType().Name; 

     foreach(var prop in change.OriginalValues.PropertyNames) 
     { 
      var originalValue = change.OriginalValues[prop].ToString(); 
      var currentValue = change.CurrentValues[prop].ToString(); 
      if (originalValue != currentValue) 
      { 
       ChangeLog log = new ChangeLog() 
       { 
        EntityName = entityName, 
        PropertyName = prop, 
        OldValue = originalValue, 
        NewValue = currentValue, 
       }; 
       ChangeLogs.Add(log); 
      } 
     } 
    }   
    return base.SaveChanges(); 
} 

に保存される前のエンティティに加えられた変更を追跡するためにChangeTrackerを使用する必要があります変更されたもの

var modifiedEntities = ChangeTracker.Entries() 
     .Where(p => p.State == EntityState.Modified).ToList(); 

同じ方法で、追加および削除されたエンティティを照会することができます。

編集

object GetPrimaryKeyValue(DbEntityEntry entry) 
{ 
     var stateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity); 
     return stateEntry.EntityKey.EntityKeyValues[0].Value; 
} 

注:アイデンティティ挿入が動作しませんスニペット上記の追加のエンティティのために、その後オンに設定されている場合。

+0

ありがとう@ jenish-rabadiya、この作品は完璧です。 – csuazo

+0

プライマリキーのみを取得できますか? – csuazo

+1

@csuazo私は答えを更新しました。 –

関連する問題