2011-05-25 26 views
9

Estoy tratando de usar Entity Framework para consultar la base de datos y tengo el siguiente código que estoy usando para obtener algunos datos.Actualización de datos utilizando Entity Framework

var students= MyEntities.Students.Where(s => s.Age > 20).ToList(); 

Este código funciona bien y devuelve datos correctos. Sin embargo, si ejecuto este código, luego voy a la base de datos y actualizo los registros para cambiar los datos que este código debe devolver, y luego vuelvo a ejecutar este código sin cerrar la aplicación, obtengo datos originales. Estoy bastante seguro de que solía funcionar bien, pero ahora esto no actualiza los datos.

Respuesta

16

No, nunca funcionó. Este es el comportamiento esencial del marco de entidad (y muchas herramientas ORM) llamado mapa de identidad (explanation here).

Si ejecuta la consulta en el mismo contexto, no obtendrá sus entidades actualizadas. Solo anexará nuevas entidades creadas en la base de datos entre ejecutar esas dos consultas. Si desea forzar EF para recargar las entidades debe hacer algo como esto:

ObjectQuery query = MyEntities.Students; 
query.MergeOption = MergeOption.OverwriteChanges; 
var students = query.Where(s => s.Age > 20).ToList(); 
+0

Si solo está consultando debe usar 'MergeOption.NoTracking'? Eso obligaría a la consulta a golpear el db. – Nix

+0

La consulta afectará DB de todos modos. No estoy seguro de lo que sucede cuando usas 'NoTracking' y ya tienes entidades en el" caché "porque al usar la carga diferida EF todavía las conserva. –

+0

Esto parece hacer lo que quiero que haga. Usar el método Refresh() también funcionaría, pero creo que usar ObjectQuery es una solución más limpia. Marcando esto como la respuesta. Sin embargo, Nix aporta un buen punto acerca de las mejores prácticas cuando se usa EF, de lo que sería bueno obtener más información, así que tendré que investigar más sobre eso. – chiefanov

6

Te encuentras con problemas porque EF almacena datos en caché, por lo que si los datos cambian tras bastidores y no dispones o vuelves a abrir el contexto, te encontrarás con problemas.

La regla general es mantener el tiempo de vida del contexto lo más corto posible, para evitar problemas como los que acabas de mencionar.

No ignore lo que dije anteriormente, pero si desea forzar una actualización de la base de datos, puede usar el método Refresh().

+0

Nota que la actualización está haciendo muchas consultas para grandes conjuntos de datos, además de la consulta real, que pueden o no se ejecutan, mientras que es query.MergeOption simplemente forzando que la consulta se lea desde la base de datos –

Cuestiones relacionadas