2010-02-25 11 views
14

Estamos cargando los datos de db:Cómo actualizar la memoria caché ObjectContext desde db?

var somethings = Context.SomethingSet.ToList(); 

Entonces alguien elimina o añade filas fuera de contexto. Fuera de contexto todavía tiene el objeto eliminado de caché, porque no sabe que fueron eliminados. Incluso si llamo Context.SomethingSet.ToList(), nuestro contexto aún contiene objetos eliminados y las propiedades de navegación no son correctas.

¿Cuál es el mejor método para actualizar todo el conjunto desde la base de datos?

Respuesta

18

El método Refresh es lo que busca:

Context.Refresh(RefreshMode.StoreWins, somethings); 
+1

Cambié la pregunta un poco. Debo llamar 'Context.Refresh (RefreshMode.StoreWins, somehings)' first y 'var somehings = Context.SomethingSet.ToList()' para obtener filas agregadas, porque refresh no las agregará. Acabo de notar en el generador de perfiles que la actualización se realiza en una consulta, por lo que el rendimiento es bastante bueno. Gracias. – LukLed

10

El contexto de datos EF es una implementación del patrón Unidad de trabajo. Como tal, NO está diseñado para ser mantenido más allá de la unidad de trabajo que se está haciendo. Una vez que finalice su trabajo, la expectativa es que su contexto de datos se descarte.

Esta es una decisión de diseño fundamental para EF v1, EF v4 y LINQ to SQL. A menos que tenga patrones de uso de datos muy específicos y copiosos volúmenes de memoria, debe evitar mantener sus contextos de datos por más tiempo del necesario para completar su unidad de trabajo.

http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

+1

Sabía que alguien daría esa respuesta :) No se preocupe. Utilizo un ObjectContext por solicitud, pero tengo un contexto que se utiliza para almacenar algunos datos en caché. Se usa solo para leer. Pero es bueno que lo hayas notado. – LukLed

+0

Bueno, me alegro de que esté eliminando sus contextos. : D No puedo contar con qué frecuencia veo a personas tratando de mantener sus contextos de objetos para siempre. Están tratando de resolver un problema percibido (un golpe de rendimiento asumido), mientras que al mismo tiempo crean una docena de problemas más graves que también perjudican el rendimiento aún más a largo plazo. Trato de aplastar ese comportamiento cada vez que lo encuentro. ; P – jrista

1

Para las propiedades virtuales Recargar no ayuda. Necesita separarse y volver a cargar

public T Reload<T>(T entity) where T : class, IEntityId 
{ 
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity); 
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id); 
} 
Cuestiones relacionadas