Как сделать недействительным внутренний фреймворк Entity Framework 4 - PullRequest
8 голосов
/ 20 марта 2012

Как я знаю, 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 ]

19 голосов
/ 20 марта 2012

Вы должны заставить 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;
8 голосов
/ 20 марта 2012

попробуйте обновить контекст:

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

...