Entity Framework 4, objetos POCO y ASP.Net MVC2. Tengo una relación de muchos a muchos, digamos entre las entidades BlogPost y Tag. Esto significa que en mi clase BlogPost de POCO generada por T4 tengo:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Solicito 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 recupero el BlogPost actualizado con propiedades cambiadas y relaciones cambiadas. Por ejemplo, tenía 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 se debe guardar 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 salve las relaciones correctamente. Probé todo lo que encontré:
- Controller.UpdateModel y Controller.TryUpdateModel no funcionan.
- Obtener el BlogPost antiguo del contexto y luego modificar la colección no funciona. (con diferentes métodos del siguiente punto)
- Esto probablemente funcionaría, pero espero que esto sea solo una solución alternativa, no la solución :(.
- Probé las funciones Adjuntar / Agregar / CambiarObjetoState para BlogPost y / o Etiquetas en todas las combinaciones posibles. Ha fallado.
- Esto parece lo que necesito, pero no funciona (traté de 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 esas y no a las originales. Por supuesto, las etiquetas devueltas tienen PK, y antes de los métodos de guardar / actualizar, verifico 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 imposible encontrar una solución simple automatizada: cuando se cambia la colección de un objeto POCO, eso debería suceder mediante 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 entristecería mucho y odiaría el triunfo de EF4-POCO-MVC :(. También eso significaría que EF no puede hacer esto en el entorno MVC cualquiera que sea Se utilizan tipos de objetos EF4 :(. Creo que el seguimiento de cambios basado en instantáneas debería descubrir que el BlogPost modificado tiene relaciones con las etiquetas con los PK existentes.
Por cierto: creo que ocurre el mismo problema con las relaciones uno a muchos (Google y mi colega lo dicen). Lo intentaré en casa, pero incluso si funciona, eso no me ayuda en mis seis relaciones de muchos a muchos en mi aplicación :(.