Actualice las relaciones al guardar cambios de objetos POCO EF4

Entity Framework 4, objetos POCO y ASP.Net MVC2. Tengo una relación de muchos a muchos, digamos entre BlogPost y entidades de etiqueta. Esto significa que en mi clase POCO BlogPost generada por T4 tengo:

public virtual ICollection<Tag> Tags {
    // getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;

Pido un BlogPost y las etiquetas relacionadas de una instancia de ObjectContext y lo envío a otra capa (Ver en la aplicación MVC). Más tarde vuelvo al BlogPost actualizado con propiedades y relaciones cambiadas. Por ejemplo, tenía las etiquetas "A", "B" y "C", y las nuevas etiquetas son "C" y "D". En mi ejemplo particular, no hay etiquetas nuevas y las propiedades de las etiquetas nunca cambian, por lo que lo único que debe guardarse son las relaciones cambiadas. Ahora necesito guardar esto en otro ObjectContext. (Actualización: ahora intenté hacerlo en la misma instancia de contexto y también fallé).

El problema: no puedo hacer que guarde las relaciones correctamente. Intenté todo lo que encontré:

Controller.UpdateModel y Controller. CalculateUpdateModel no funcionan.Obtener el viejo BlogPost del contexto y luego modificar la colección no funciona. (con diferentes métodos desde el siguiente punto)Esta probablemente funcionaría, pero espero que esto sea solo una solución, no la solución :(.Intenté las funciones Adjuntar / Agregar / CambiarObjetoEstado para BlogPost y / o Etiquetas en todas las combinaciones posibles. Ha fallado.Esta se parece a lo que necesito, pero no funciona (intenté arreglarlo, pero no puedo por mi problema).Intenté ChangeState / Add / Attach / ... los objetos de relación del contexto. Ha fallado.

"No funciona" significa en la mayoría de los casos que trabajé en la "solución" dada hasta que no produce errores y guarda al menos las propiedades de BlogPost. Lo que sucede con las relaciones varía: por lo general, las etiquetas se agregan nuevamente a la tabla de etiquetas con nuevas PK y el BlogPost guardado hace referencia a ellas y no a las originales. Por supuesto, las etiquetas devueltas tienen PK, y antes de los métodos de guardar / actualizar compruebo las PK y son iguales a las de la base de datos, por lo que probablemente EF piense que son objetos nuevos y esas PK son las temporales.

Un problema que conozco y podría hacer que sea imposible encontrar una solución simple automatizada: cuando se cambia la colección de un objeto POCO, eso debería suceder por la propiedad de colección virtual mencionada anteriormente, porque entonces el truco FixupCollection actualizará las referencias inversas en el otro extremo de la relación de muchos a muchos. Sin embargo, cuando una Vista "devuelve" un objeto BlogPost actualizado, eso no sucedió. Esto significa que tal vez no haya una solución simple para mi problema, pero eso me pondría muy triste y odiaría el triunfo de EF4-POCO-MVC :(. Además, eso significaría que EF no puede hacer esto en el entorno de MVC. Se utilizan los tipos de objetos EF4 :(. Creo que el seguimiento de cambios basado en una instantánea debería descubrir que el BlogPost modificado tiene relaciones con las etiquetas con PK existentes.

Por cierto: creo que el mismo problema ocurre con las relaciones uno a muchos (Google y mi colega lo dicen). Lo intentaré en casa, pero incluso si eso funciona, eso no me ayuda en mis seis relaciones de muchos a muchos en mi aplicación :(.

Respuestas a la pregunta(5)

Su respuesta a la pregunta