Tengo una aplicación WPF que tiene una cuadrícula con una lista de datos que he cargado con EF. Algunas otras ventanas pueden realizar cambios en los mismos datos cargados en la grilla pero usando una instancia de dbcontext diferente. ¿Cómo puedo ver los datos modificados en la cuadrícula? Sé que puedo actualizar una sola entidad con ctx.Entry<MyEntity>(instance).Reload();
, pero quiero ver todos los cambios y no importa lo que haga, solo veo los valores anteriores. No puedo usar AsNoTracking
ni crear una nueva instancia de DbContext
en este caso.Cambios de carga realizados en otro DbContext
Respuesta
Para mí parece un caso muy simple y no puedo ver por qué EF no solo actualiza los valores de las entidades.
EF tiene este mecanismo también, pero no está expuesto en DbContext API. Debe volver a ObjectContext. Si lo que desea para recargar el conjunto de entidades que llamará:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload);
RefreshMode.StoreWins
hace que todos los cambios pendientes a ser sustituidos por valores vuelto a cargar. También puede usar RefreshMode.ClientWins
que mantendrá sus cambios y los fusionará con los datos recargados. El problema con este enfoque es que solo recarga las entidades que ya tiene. No obtendrás nuevas entidades.
Si desea obtener nuevas entidades, así es necesario ejecutar una consulta y deberá informar a EF que desea volver a cargar los valores:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<MyEntity>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
var result = objectSet.Where(...).ToList();
Una vez más MergeOption.OverwriteChanges
sobrescribe todos los cambios pendientes, pero puede utilizar MergeOption.PreserveChanges
fusionar valores recargados a sus valores editados.
Creo que todavía puede haber algunos problemas con valores refrescantes con algunas relaciones y quizás también entidades que se eliminaron en la base de datos.
Esto es exactamente lo que necesito, gracias, mi fe en EF está restaurada :) – user1526627
@ ladislav-mrnka Una pregunta, ¿ese último paso es realmente necesario? Si te entendí correctamente, EF solo reconocerá los cambios en los registros que ya se hayan cargado y los fusionará de la primera manera. Entonces, si agregara una nueva fila a una tabla manualmente, ¿no se actualizaría en el contexto dbcontext de la primera manera? Acabo de probar esto y no vi la necesidad de la segunda manera. Tal vez el comportamiento cambió o te malentendí por completo. :) – DrCopyPaste
- 1. ¿Detecta cambios de estado realizados en BluetoothAdapter?
- 2. ¿Cómo deshace los cambios realizados en un DataGridView encuadernado?
- 3. clojure REPL no detecta los cambios realizados en defrecord
- 4. ¿Cómo descartar todos los cambios realizados en una sucursal?
- 5. Error de Git: Cambios no realizados para la confirmación
- 6. Git: use revertir o pagar para deshacer los cambios realizados?
- 7. git-diff: Mostrar solo cambios realizados para confirmar
- 8. Cómo revertir los cambios realizados en un objeto en Silverlight 3 con un enlace TwoWay
- 9. ¿Puede GitHub mostrar el historial de cambios realizados en un archivo en forma de parche?
- 10. Obtener todos los cambios realizados en un objeto en Entity Framework
- 11. Detectar todos los cambios (realizados por el usuario) al texto en controles en el formulario
- 12. C# Problema: ¿Cómo guardo los cambios realizados en DataGridView en la DataTable utilizada?
- 13. DbContext y RejectChanges
- 14. ¿Cómo desactivo el seguimiento de cambios en el nivel de DbContext en EF 4.1 RC?
- 15. TFS: enviar cambios realizados localmente en una rama a otra rama
- 16. Git: ¿Cómo puedo fusionar los cambios realizados entre dos etiquetas en otra rama?
- 17. ASP.NET MVC 3 Ajax.BeginForm y Html.TextBoxFor no refleja los cambios realizados en el servidor
- 18. carga jQuery en otro archivo js
- 19. registerOnSharedPreferenceChangeListener no funciona para los cambios realizados en el proceso diferente
- 20. Re evaluar consulta Django después de los cambios realizados a la base de datos
- 21. Subclipse (1.8.5) requiere ciclo de limpieza/refresco para detectar los cambios realizados con TortoiseSVN (1.7.4)
- 22. QCheckBox: ¿cómo diferenciar entre los cambios de estado inducidos por el usuario y los realizados programáticamente?
- 23. variables de carga desde otro script PowerShell
- 24. seguimiento de cambios de discrepancia con el Código DbContext y EF Primera
- 25. Caché interna de DbContext (?)
- 26. DBContext lazyloadingenabled establecido en true todavía carga entidades relacionadas de forma predeterminada
- 27. Entidad de navegación de Ent.Mark 4 de ASP.NET que no refleja los cambios realizados en la base de datos
- 28. ¿Cómo realizo un seguimiento de los cambios realizados en los sistemas a través del cuchillo en chef?
- 29. Agregando cambios de un repositorio de Mercurial a otro
- 30. Uso de ObjectContext y DbContext
¿Por qué no puede usar 'AsNoTracking'? –
Porque el usuario puede realizar cambios directamente a la grilla y guardarla. – user1526627
Pero en tal caso, ¿puede haber editado datos no guardados y la recarga puede hacer que estos datos sean diferentes? ¿Cómo quieres resolver ese problema? –