2015-09-15 22 views
7

私は困惑しています - Entity Framework 7にアップグレードし、変更する前にすべての変更済みオブジェクトのリストを取得できるように、通常DbContext内のSaveChangesをオーバーライドします。最終的に私はデータベース内の前のバージョンを追跡するスクリプトを起動します。 Entity Frameworkは6で私のようなモデル変更になるだろうので:Entity Framework 7内の変更されたオブジェクトのリストを取得

var oc = ((IObjectContextAdapter)this).ObjectContext; 
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted); 

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList(); 

しかし今ObjectContextはEntity Frameworkの7以内に削除されていることを、私はこだわっています、どのように私は、Entity Frameworkの7の内側に変更されたオブジェクトのリストを取得するのでしょうか?

+1

「context.ChangeTracker.Entries()。where(x => x.State == ...)」 – dotctor

+1

@dotctorを回答として追加して回答を受け入れることができます –

答えて

5

あなたは、いくつかのケースでは動作しないことがありDbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker 
     .Entries() 
     .Where(x => x.State == EntityState.Modified) 
     .Select(x =>x.Entity) 
     .ToList(); 
+4

Modified Properties ChangeTracker –

0

@dotctorのコードを使用することができます。

コンテキストによって管理されているエンティティに関する変更トラッカーが最新の情報を持たない場合があるため、変更トラッカーが認識していないエンティティを変更/追加/削除することができます。このような場合を避けるために、私は以下の条件で@dotctorのコードをラップします:

if(context.ChangeTracker.HasChanges()) 
{ 
    ... 
} 


マイクロソフトChangeTracker.HasChangesの概要()

小切手いずれかが新しい、削除した場合、 DbContext.SaveChangesまたはDbContext.SaveChangesAsyncが呼び出された場合、これらの変更がデータベースに送信されるように、変更されたエンティティが追跡されています。 ChangeTracker.AutoDetectChangesEnabledがfalseに設定されていない限り、このメソッドはChangeTracker.DetectChangesを呼び出します。

関連する問題