8

私が知っているように、Entity Framework は Identity Map パターンを実装しているため、EF はいくつかのエンティティをメモリにキャッシュします。

例を挙げましょう。

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を再作成せずに新しいエンティティを取得する方法はありますか?

手伝ってくれてありがとう。

4

2 に答える 2

19

エンティティをリロードするように EF を強制する必要があります。エンティティごとに次のいずれかを実行できます。

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;
于 2012-03-20T10:14:52.953 に答える
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

于 2012-03-20T10:13:26.167 に答える