8

エンティティフレームワークがアイデンティティマップパターンを実装しているので、EFはメモリ内のいくつかのエンティティをキャッシュします。エンティティフレームワーク4の内部キャッシュを無効にする方法

例を挙げておきます。

var context = new StudentContext(); 

var student = context.Students.Where(st => st.Id == 34).FirstOrDefault(); 

// any way of changing student in DB 
var anotherContext = new StudentContext(); 
var anotherStudent = anotherContext.Students.Where(st => st.Id == 34).FirstOrDefault(); 
anotherStudent.Name = "John Smith"; 
anotherContext.SaveChanges(); 

student = context.Students.Where(st => st.Id == 34).FirstOrDefault(); 
// student.Name contains old value 

最初のコンテキストのキャッシュを無効にして、コンテキストを再作成することなく、新しいstudentエンティティを取得する方法はありますか?

ありがとうございました。

答えて

19

エンティティを強制的にリロードする必要があります。あなたは、エンティティごとにそれを行うことができ、次のいずれか

context.Refresh(RefreshMode.StoreWins, student); 

またはクエリのためにそれを行うことができます。

ObjectQuery<Student> query = (ObjectQuery<Student>)context.Students.Where(st => st.Id == 34); 
query.MergeOption = MergeOption.OverwriteChanges; 
student = query.FirstOrDefault(); 

またはオブジェクトセットにグローバルに変更:

context.Students.MergeOption = MergeOption.OverwriteChanges; 
8

すると、コンテキストを更新してみてください:

context.Refresh(RefreshMode.StoreWins, yourObjectOrCollection); 

だからあなたの場合には、あなたがのObjectContext

var objContext = ((IObjectContextAdapter)this).ObjectContext; 

に取得し、それを更新する必要があります。ここに

objContext.Refresh(RefreshMode.StoreWins, anotherStudent); 

詳細情報:http://msdn.microsoft.com/en-us/library/bb896255.aspx

関連する問題