2011-05-05 21 views
7

Tengo una aplicación MVC3 que utiliza POCO/repositorios EF4. Cada vez que el usuario abre un elemento en el sitio web, este se marca en la base de datos. Hay un servicio de back-end que sigue comprobando si hay elementos que han sido marcados por más 'x' segundos y los desmarca. El problema con el que me estoy encontrando es en mi servicio de back-end; la consulta que ejecuto parece encontrar los elementos marcados, pero cuando verifico el elemento individual para que se marque, la entidad no se ha actualizado.EF4 - Los datos no se actualizan/actualizan

Aquí está mi código que busca los elementos marcados

var list = Context.Transactions 
      .Where(t => t.Locked).ToList() ; 

El list.Count() me devuelve el número correcto. Pero cuando empiezo a iterar a través de la lista, encuentro que t.Locked = false

Cuando ejecuto el analizador de SQL puedo ver que para mi código anterior, los datos se recuperan correctamente de la base de datos. Es este caché o un problema de mapa de identidad que no estoy utilizando el EF correctamente.

Respuesta

12

Lea con mucho cuidado this answer. Después de eso, le recomiendo que refactorice su aplicación para usar un nuevo contexto para cada solicitud (en el caso de la web) y un nuevo contexto para cada evento de tiempo en el servicio de back-end.

EF utiliza el patrón de mapa de identidad. Una vez que la entidad se carga según el contexto, siempre obtendrá la misma instancia con los mismos valores a pesar de los datos devueltos por la nueva consulta. Hay formas de obligar a EF a actualizar la entidad, pero principalmente se trata de resolver algunos problemas de concurrencia.

Si usted todavía no está condenado a cambiar su solicitud de utilizar esto para forzar los valores refrescantes:

var query = (ObjectQuery)(yourLinqQuery); 
query.MergeOption = MergeOption.OverwriteChanges; 
// Now iterate/execute query 
Cuestiones relacionadas