none
EF4, Self Tracking Entities y relaciones muchos a muchos. RRS feed

  • Pregunta

  • Hola.

    Tengo el siguiente problema. En un escenario con dos tablas del tipo "Cursos" y "Alumnos" clásica, donde un alumno puede inscribirse en múltiples cursos y un curso puede tener múltiples alumnos, sucede que los cursos están dados de alta en el sistema. En el formulario de asignación de cursos a nuevos alumnos, se rellena la ficha del nuevo alumno y se asigna un curso ya existente a la colección "Cursos" del objeto "Alumno".

    Cuando envío el alumno nuevo con su curso ya existente a almacenarse en el contexto mediante

              context.Alumnos.AddOject(alumno);

              context.SaveChanges();

    lo que sucede es que me da de alta el nuevo registro para el alumno, pero me duplica en la tabla de cursos el curso seleccionado, cuando lo que quiero es que en la tabla intermedia se inserte la relación correspondiente.

    ¿Qué estoy haciendo mal?

    Grácias y un saludo.

    miércoles, 8 de febrero de 2012 11:49

Respuestas

  • Ya esta.

    El problema está en el intento de almacenar el grafo mediante

    ctx.Operarios.AddObject(ope);

    Con esto le estoy indicando que voy a insertar no solo la entidad, sino todo el grafo entero. Para que la cosa funcione y no duplique el objeto cargo, hay que almacenar el grafo mediante

    ctx.Operarios.ApplyChanges(ope);

    ctx.SaveChanges();

    De este modo se ha realizado la inserción del operario, la inserción en la tabla intermedia de la relación entre el operario y el cargo seleccionado y no me ha duplicado el cargo en la tabla.

    Gracias Alberto por el tiempo dedicado. Un saludo.

    • Marcado como respuesta vcatala jueves, 9 de febrero de 2012 18:11
    jueves, 9 de febrero de 2012 18:11

Todas las respuestas

  • Hola Vicent,

    creo que tienes algún problema entre el modelo y la tablas, yo haría lo siguiente:

    - Crear un nuevo proyecto en Visual Studio partiendo de un EDMX vacío.

    - Crear las dos entidades del modelo y crear la asociación muchos a muchos

    - Generar el script para la generación de las tablas.


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server

    miércoles, 8 de febrero de 2012 20:55
  • Hola Alberto,

    ante todo, grácias por contestar.

    He realizado la prueba que me has dicho. He creado un proyecto nuevo, he creado un EDMX vacio y le he añadido dos entidades con una relación muchos a muchos.

    Entidad A (Operario: Id int PK, Nombre nvarchar(max))

    Entidad B (Cargo: Id int PK, Nombre nvarchar(max))

    relación: CargoOperario.

    Seguidamente creo la base de datos desde el modelo (el jodio modelFirst. El problema es que los proyectos que tengo provienen de bases de datos en producción con aplicaciones en VB6, de donde vengo y me siento como pez en el agua, pero esa es otra historia... :( )

    El siguiente paso es Agregar elemento de generación de código para utilizar objetos STE. Hasta aquí, todo de escándalo de bien (solo faltaba...)

    Relleno manualmente la tabla [Cargos] con tres registros. Peón, Oficial y Maquinista.

    Abro el formulario vacio del proyecto e inserto un botón con el siguiente código en el evento:

                //simular la recuperación del objeto desde el repositorio

                Operario ope = new Operario { Nombre = "Bartolo" }; //creo nuevo operario.
                Cargo car = null;

                using (WindowsFormsApplication1.Model1Container ctx = new Model1Container())
                {
                    car = ctx.Cargos.First();     //trinco el primer cargo que exista. (Peón)
                }

                ope.Cargos.Add(car);     //asigno el cargo a la colección cargos del operario nuevo.

                //simular la grabación del objeto al repositorio.

                using (WindowsFormsApplication1.Model1Container ctx = new Model1Container())
                {
                    ctx.Operarios.AddObject(ope);
                    ctx.SaveChanges();
                }

    Y voilá, en la tabla de cargos tengo duplicado en cargo "Peón" y en la tabla de relación intermedia la relación entre el id del operario creado y el id del cargo duplicado.

    Algo tengo que estar haciendo mal, ya que lo que quiero no es que me duplique el cargo. Simplemente, que cree la relación entre el nuevo operario y el cargo existente.

    Un saludo y un sincero agradecimiento por vuestra ayuda.

    jueves, 9 de febrero de 2012 12:12
  • Ya esta.

    El problema está en el intento de almacenar el grafo mediante

    ctx.Operarios.AddObject(ope);

    Con esto le estoy indicando que voy a insertar no solo la entidad, sino todo el grafo entero. Para que la cosa funcione y no duplique el objeto cargo, hay que almacenar el grafo mediante

    ctx.Operarios.ApplyChanges(ope);

    ctx.SaveChanges();

    De este modo se ha realizado la inserción del operario, la inserción en la tabla intermedia de la relación entre el operario y el cargo seleccionado y no me ha duplicado el cargo en la tabla.

    Gracias Alberto por el tiempo dedicado. Un saludo.

    • Marcado como respuesta vcatala jueves, 9 de febrero de 2012 18:11
    jueves, 9 de febrero de 2012 18:11