2010-09-10 11 views
11

Creé mi propio contexto que hereda de DbContext. Supongamos que tengo 1 publicación en mi tabla [Publicaciones] en la base de datos. Considere este escenario:Caché interna de DbContext (?)

  1. te pido DbContext para este único puesto para el primera vez. Y DbContext lo devuelve como se esperaba.
  2. Cambio una columna en la tabla [Posts] manualmente.
  3. Renovar mi sitio = Pido otra vez a DbContext para esta publicación.
  4. DbContext devuelve una publicación que tiene un valor antiguo para esta columna específica.

I mirado en el Analizador de SQL y la base de datos es golpeado cada vez que refrescar mi sitio, ¿por qué el mensaje devuelto tiene un valor antiguo? Supongo que DbContext está tratando de ser muy inteligente y tiene algún mecanismo interno de almacenamiento en caché, pero sería bueno informarme que es tan inteligente ...

¿Alguien me puede explicar esto?

+0

posible duplicado del modelo [EF 4.0 almacenando en caché los datos, y no detecta los datos modificados.] (Http://stackoverflow.com/questions/3617987/ef-4-0-model-caching-the-data-and- does-not-detect-the-modified-data) –

+0

Su pregunta se divide en dos preguntas ya hechas. Problema de caché: http://stackoverflow.com/questions/3617987/ef-4-0-model-caching-the-data-and-does-not-detect-the-modified-data/3621477#3621477 Problema de contexto compartido : http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 –

+0

¿Su instancia de su 'DbContext' estática, o está creada en cada solicitud de página? –

Respuesta

0

¿Cómo está "refrescante"? Si conoces a un valor ha cambiado, puede actualizar el valor almacenado en caché contexto utilizando ServerWins o ClientWins:

http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx

// Resolve the concurrency conflict by refreshing the 
// object context before re-saving changes. 
context.Refresh(RefreshMode.ClientWins, orders); 

Sin embargo, la verdadera pregunta se reduce a cuándo y por qué esto iba a pasar en el primer lugar , que está relacionado con de por vida del contexto. ¿Quizás podrías estar usando demasiado el mismo contexto? Recuerde que SQL Server y etc. tienen su propio mecanismo de caché, y por lo tanto, Entity Framework no es el único pez en el estanque de elementos que intentan almacenar en caché.

De, el siguiente enlace recogemos algunos consejos, que si estuviera siguiendo, probablemente no se encuentre con este problema. http://msdn.microsoft.com/en-us/data/jj729737.aspx

  • Como se carga más objetos, el consumo de memoria del contexto puede aumentar rápidamente
  • posibilidades de toparse con problemas relacionados con la concurrencia aumenta con el tiempo de vida ampliado
  • Cuando se trabaja con aplicaciones Web, utilizan una instancia de contexto por Solicitar
  • Cuando se trabaja con Windows Forms, usar un contexto por forma