8

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.

Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
Ivan Bianko
  • 1,749
  • 15
  • 22

2 Answers2

19

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;
Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
8

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

Giorgio Minardi
  • 2,765
  • 1
  • 15
  • 11