8

据我所知,实体框架实现了身份映射模式,因此 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 回答