2013-11-28 11 views
60

コンテキストを更新するにはどうすればよいですか?データベースからのビューに基づいたエンティティがあり、ビューに対するナビゲーションプロパティを持つ1つのテーブルエンティティを更新すると、エンティティは更新されますが、ビューは新しい更新に合わせて更新されません。 Dbはデータを表します。 ありがとう!Entity Frameworkの更新コンテキスト?

context.Refresh(RefreshMode.StoreWins, yourEntity); 

または代替的には、あなたの現在のコンテキストを破棄し、新しいものを作成します。

答えて

11

Refreshメソッドを使用します。

+32

これはEntity Framework 6では機能しません – JMK

+0

@JMKここでは正確には機能しないものはありますか?私にとってはうまくいくようです(EF 6.1.1)。 –

+0

@SebastianKrysmanski私は約1年前にコメントしました。 – JMK

58

コンテキスト内のエンティティをリフレッシュする最も良い方法は、コンテキストを破棄して新しいコンテキストを作成することです。

あなた本当には、いくつかのエンティティを更新する必要があり、DbContextクラスとコードファーストアプローチを使用している、あなたは、コレクションのナビゲーションプロパティをリロードするには

public static void ReloadEntity<TEntity>(
     this DbContext context, 
     TEntity entity) 
     where TEntity : class 
    { 
     context.Entry(entity).Reload(); 
    } 

を使用することができる場合、あなたは

public static void ReloadNavigationProperty<TEntity, TElement>(
     this DbContext context, 
     TEntity entity, 
     Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) 
     where TEntity : class 
     where TElement : class 
    { 
     context.Entry(entity).Collection<TElement>(navigationProperty).Query(); 
    } 
を使用することができます

参考: https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx#M:System.Data.Entity.Infrastructure.DbEntityEntry.Reload

+2

ReloadNavigationPropertyのサンプル使用方法を教えてくださいthx – David

+0

子ナビゲーションのプロパティを再読み込みすることができません。 – Paul

45
yourContext.Entry(yourEntity).Reload(); 
+2

簡単な解決法をお寄せいただきありがとうございます。私はRX_DID_RXのような拡張メソッドでこれをカプセル化する必要性を見ていません – Thomas

+0

これは私にとって救世主でした。ありがとうございました! – Kevin

+7

これは、コレクションのナビゲーションプロパティをリロードせず、エンティティエントリ自体をリロードすることに注意してください。 –

-5

私は自分の頭を何も傷つけませんでした!あなたは、エンティティ-noが派手なシステム・メソッドを再ロードしていないしている - 回答は

some_Entities e2 = new some_Entities(); //your entity. 

削除/アップデート後に下の行を追加します...私はちょうど戻って基本的に行ってきました 非常にsimple-ました。

e2 = new some_Entities(); //reset. 
+15

あなたは正しい質問をしていますか? –

19

特定のエンティティをリロードする場合は、DbContextApiを使用して、RX_DID_RXからすでに回答が得られています。

リロードしたい場合は/あなたがロードされたすべてのエンティティリフレッシュ:あなたはEntity Frameworkの4.1以降(EF5、またはおそらくEF 6)、DbContextのAPIを使用している場合

を:

public void RefreshAll() 
{ 
    foreach (var entity in ctx.ChangeTracker.Entries()) 
    { 
      entity.Reload(); 
    } 
} 

あなたの場合entityFramework 4(のObjectContext API)を使用している:

public void RefreshAll() 
{ 
    // Get all objects in statemanager with entityKey 
    // (context.Refresh will throw an exception otherwise) 
    var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted 
               | EntityState.Modified 
               | EntityState.Unchanged) 
             where entry.EntityKey != null 
             select entry.Entity); 

    context.Refresh(RefreshMode.StoreWins, refreshableObjects); 
} 

とにかく最高のアドバイスです、「短命コンテキスト」を使用すると、あなたがこの種の問題を回避しますしてみてください。

私は問題についての記事のカップルを書いた:リロードとデシベルのコンテキストを更新

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

-2

は、パフォーマンスのために道を失うお勧めしません。各操作が実行される前に、dbcontextの新しいインスタンスを初期化することは十分に有効です。また、各操作の最新のコンテキストを最新の状態に戻すこともできます。

using (YourContext ctx = new YourContext()) 
{ 
    //Your operations 
} 
+6

Dude ..毎回コンテキストをダンプすることで、リフレッシュしたくないものがリフレッシュされるため、実際にパフォーマンスの問題が発生します。 – LuckyLikey

+2

これは単体テストを書く能力に影響するので、これはひどい考えです。あなたのコードが消えてニュースが新しい文脈になったら、単体テスト中にどうやったらうまくいくのでしょうか? – victor

+0

批判をするのではなく、いくつかのサンプルを見せてくれれば、私と他の人にとっては役に立ちます。 – aog

4

context.Reload()はMVC 4、EF 5で私のために働いていなかったので、私はこれを行いました。

context.Entry(entity).State = EntityState.Detached; 
entity = context.Find(entity.ID); 

とその正常動作。

関連する問題