Как сделать недействительным внутренний фреймворк Framework 4
Как я знаю, 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
сущность без воссоздания контекста?
Спасибо за помощь.
2 ответа
Решение
Вы должны заставить 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;
Попробуйте обновить контекст:
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