EF no tiene ninguna operación directa de "rechazo de cambios". Puede acceder a las entradas de entidades en ChangeTracker
/ObjectStateManager
y sobrescribir los valores actuales con los valores originales para las entidades modificadas. También puede separar entidades añadidas y volver a cambiar las entidades eliminadas sin cambios, pero todas funcionarán principalmente si usted (o EF internamente) no cambió el estado de ninguna asociación (relación) independiente. Si también trabajas con relaciones, todo puede ser mucho más complicado porque también debes revertir las relaciones; en tal caso, es más sencillo volver a cargar los datos.
Para revertir los cambios en la API DbContext puede probar esto:
foreach (var entry in context.ChangeTracker
.Entries<YourEntityType>()
.Where(e => e.State == EntityState.Modified))
{
entry.CurrentValues.SetValues(entry.OriginalValues);
}
En este caso creo que el principal problema es la forma en cómo se trabaja con entidades - se permiten cambios de datos en tiempo real y EF hace su lógica Detrás para mantener la coherencia de los datos cuando se realizan cambios, pero más tarde decide que esos cambios no se guardarán. En este caso, usted debe hacer uno de los siguientes:
- Descartar los datos modificados y volver a cargar conjunto de datos entero (por recrear el contexto)
- independiente esta lógica a no funcionar en datos en tiempo real y empuje la modificación de datos de contexto EF solamente cuando la modificación es realmente confirmada
El contexto está haciendo algo si usted lo dice para hacer algo. Nunca se vuelve ocupado en sí mismo.
Recrear el contexto sería una buena solución. Sin embargo, estaba teniendo problemas con la sincronización de datos relacionados. Un ejemplo sería que tenía CRUD en CollectionA en ViewA, y CRUD en COllectionB en ViewB. CollectionB también hace referencia a CollectionA. Entonces, si tengo 2 objetos Context, tanto para CollectionA como CollectionB, ¿cómo sincronizaría ViewB, si cambio CollectionA en ViewA? Cuando se tiene un contexto, todo es sincronización, ya que en realidad estamos trabajando en una única colección de instancia A, no en dos. Recrear Contexto "global" crearía un caos. :) ¿Cometí un error al usar el contexto "global"? – Goran
En cuanto al "Ocupado", me preocupaba lo que sucedería si ejecutaba una carga en modo sincronizado, y luego intentaba emitir otra carga, ¿mientras que antes no terminaba? De esta forma podría verificar si está "Ocupado", así podría poner en cola una nueva Carga. – Goran
+1 para notar lo que la mayoría de la gente parece perder. las relaciones: es posible tener cambios rastreados que no se recogerán simplemente mirando a través de la colección de entradas para el estado! = Sin cambios. (EF v6.) – mwardm