2012-01-31 15 views
7

He estado usando mucho Entity Framework en una aplicación MVVM WPF recientemente y me encontré con algunos problemas. Para mostrar datos, mis modelos de vista están usando un ObjectContext de corta duración. Estos modelos de vista se usarán en un proceso de larga ejecución, por lo que preferí usar ObjectContext de corta duración para no deteriorar el rendimiento.Entity Framework no realiza un seguimiento de los cambios en la recopilación al reconectar una entidad

Así que, básicamente, significa que mis entidades se consumen en modo desconectado. Estas entidades se pueden crear, ver, actualizar y eliminar. No tuve ningún problema para guardar los cambios en la base de datos utilizando el modo desconectado. Pero encontré un caso particular en el que los cambios no se guardan sin que aparezcan errores al llamar al método SaveChanges(). Esto sucede cuando intento actualizar una entidad que tiene una propiedad de colección. La propiedad escalar de la entidad se conserva sin problemas, pero los cambios en las colecciones no se reflejan en la base de datos, por ejemplo, si no pudo hacer un seguimiento de estos cambios en la reconexión.

Aquí hay un código de muestra de mi caso donde cambio el nombre de la entidad y luego agrego un objeto a su colección de informes. Después de SaveChanges(), solo el nombre del cliente se ha reflejado en la base de datos.

this.Client.Name = "Test Client"; 
this.Client.Reports.Add(new Report { Name = "Test Report" }); 

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName)) 
{ 
    entities.Clients.ApplyCurrentValues(this.Client); 
    entities.SaveChanges(); 
} 

Así que estoy haciendo haciendo algo mal o EF simplemente no es capaz de realizar un seguimiento de este tipo de cambios cuando vuelva a fijar una entidad?

Respuesta

8

Eso es exactly what happens. No hay seguimiento de cambios y EF no sabe acerca de los cambios realizados en la propiedad de navegación. También ApplyCurrentValues es capaz de procesar solo propiedades escalares y complejas. No propiedades de navegación.

Cuando se modifican las relaciones en escenarios separados, se debe indicar manualmente a EF qué relaciones se modificaron una vez que se adjunta la entidad. Puede crear alguna lógica personalizada que proporcione esta información y usar ObjectStateManager para configurar los estados de todas las relaciones o simplemente puede cargar la versión actual con las relaciones de la base de datos y sincronizar manualmente los cambios de la versión separada a la versión adjunta cargada.

Btw. Nunca utilicé MVVM, así que no estoy seguro de cómo se aplica en este caso, pero en el caso de MVP puede usar contexto de larga duración si se usa para una sola operación, por ejemplo, la vista de edición será manejada por su propio presentador con su propio contexto . Este contexto vivirá mientras se use view para editar entidad individual/aggregate = se usará para cargar entidad y se usará el mismo contexto para guardar entidad porque en este caso la edición se realiza por el mismo contexto de ejecución y pertenece a única unidad de trabajo.

+0

Caso realmente interesante. Ahora, el hecho de que EF no actualice estos cambios tiene sentido ya que la entidad de propiedad de navegación también puede ser referenciada por otra entidad. No hay problema cuando se crea una nueva entidad, pero los problemas de concurrencia pueden ocurrir con la eliminación. En mi arquitectura, cada MVVM como una única responsabilidad del paradigma CRUD. Trasladé mi máquina virtual al modo conectado (la arquitectura eliminó el proceso de eliminación) y los perfiles de memoria no revelaron ningún problema por el momento. El tiempo dirá y en realidad es bastante fácil volver al modo desconectado. Gracias por tu ayuda. – Ucodia

Cuestiones relacionadas