Entity Framework no rastrea los cambios de colección cuando se vuelve a conectar una entidad

He estado usando mucho Entity Framework en una aplicación MVVM WPF recientemente y encontré algunos problemas. Para mostrar datos, mis modelos de vista utilizan un ObjectContext de corta duración. Estos modelos de vista se utilizarán en un proceso de ejecución prolongada, por lo que prefiero utilizar ObjectContext de corta duración para no deteriorar el rendimiento.

Básicamente, significa que mis entidades se consumen en modo desconectado. Estas entidades pueden crearse, visualizarse, actualizarse y eliminarse. No tuve ningún problema para guardar los cambios en la base de datos usando el modo desconectado. Pero encontré un caso particular en el que los cambios no se guardan sin que aparezcan errores en la llamada de SaveChanges() método. 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, como si no pudiera rastrear estos cambios en la reconexión.

Aquí hay un código de muestra de mi caso en el que cambio el nombre de la entidad y luego agrego un objeto a su colección de informes. Después 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();
}

Entonces, ¿estoy haciendo algo mal o EF simplemente no puede rastrear este tipo de cambios al volver a adjuntar una entidad?

preguntado el 31 de enero de 12 a las 08:01

1 Respuestas

Es decir exactamente lo que pasa. No hay seguimiento de cambios y EF no conoce 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.

Al modificar relaciones en escenarios separados, debe decirle manualmente a EF qué relaciones se modificaron una vez que adjunta la entidad. Puede crear una lógica personalizada que proporcione esta información y utilice 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.

Por cierto. Nunca usé MVVM, así que no estoy seguro de cómo se aplica en este caso, pero en el caso de MVP, puede usar el 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 la vista se use para editar una entidad única / agregado = se usará para cargar la entidad y el mismo contexto se usará para guardar la entidad porque en este caso la edición se realiza por el mismo contexto de ejecución y pertenece a Unidad única de trabajo.

contestado el 23 de mayo de 17 a las 13:05

Caso realmente interesante. Ahora bien, el hecho de que EF no actualice estos cambios tiene sentido ya que la entidad de la propiedad de navegación también puede ser referenciada por otra entidad. No hay problema cuando se crea una nueva entidad, pero pueden ocurrir problemas de simultaneidad con la eliminación. En mi arquitectura, cada MVVM como una única responsabilidad del paradigma CRUD. Moví mi VM al modo conectado (el proceso de eliminación lo maneja mi arquitectura) y el perfil de memoria no reveló ningún problema por ahora. El tiempo lo dirá y en realidad es bastante fácil volver al modo desconectado. Gracias por tu ayuda. - Ucodia

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.