8

Como sé, Entity Framework implementa el patrón de mapa de identidad, por lo que EF almacena en caché algunas entidades en la memoria.Cómo invalidar el caché interno de la estructura 4 de la entidad

Déjeme darle un ejemplo.

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 

¿Hay una manera de invalidar la caché de primer contexto y recuperar nueva entidad student sin volver a crear contexto?

Gracias por la ayuda.

Respuesta

19

Debe forzar a EF a volver a cargar la entidad. Usted puede hacer eso por entidad:

context.Refresh(RefreshMode.StoreWins, student); 

o puede hacerlo por consulta:

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

o cambiarlo a nivel mundial en el set de objetos:

context.Students.MergeOption = MergeOption.OverwriteChanges; 
8

prueba a actualizar el contexto:

context.Refresh(RefreshMode.StoreWins, yourObjectOrCollection); 

Así que en su caso de tener que llegar a la ObjectContext

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

Y actualizarla:

objContext.Refresh(RefreshMode.StoreWins, anotherStudent); 

Más información aquí: http://msdn.microsoft.com/en-us/library/bb896255.aspx

Cuestiones relacionadas