Question

As I know Entity Framework implements the Identity Map Pattern, so EF caches some entities in the memory.

Let I give you example.

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   

Is there a way to invalidate first context's cache and retrieve new student entity without recreating context?

Thanks for help.

Was it helpful?

Solution

You must force EF to reload the entity. You can either do that per entity:

context.Refresh(RefreshMode.StoreWins, student);

or you can do it for query:

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

or change it globally on object set:

context.Students.MergeOption = MergeOption.OverwriteChanges;

OTHER TIPS

try refreshing the context:

context.Refresh(RefreshMode.StoreWins, yourObjectOrCollection);

So in your case you need to get to the ObjectContext

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

And refresh it:

objContext.Refresh(RefreshMode.StoreWins, anotherStudent);

More info here : http://msdn.microsoft.com/en-us/library/bb896255.aspx

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top