none
Consulta LINQ to Entities Insert a una tabla con relación muchos a muchos. RRS feed

  • Pregunta

  • Hola quisiera saber como hago para para hacer un insert a una tabla que contiene relacion muchos a muchos, escribo en concreto lo que tengo y lo que quiero hacer:

     

    1) Tengo 3 tablas USUARIO, ROLES, ROLESUSUARIOS de relacion muchos a muchos.

    2) La tabla roles tiene cargado 5 roles.

    3) Lo que quiero hacer es agregar un nuevo usuario con un ROL que ya se encuentra en la tabla ROLES.

     

    Ejemplo:

    Abajo escribo un pequeño codigo con lo que quiero hacer con unos comentarios de las pruebas que he realizado no se si me pueden guiar o o rientar para ver como puedo garbar en LINQ TO Entities en una tabla que tenga una relación de muchos a muchos un usuario con un rol que exista se debe poder pero no se me ocurre como, muchas gracias por su ayuda.

    private void grabarUsuario

    {

    Try

    {

                            ELAG_USUARIOS   _user = new ELAG_USUARIOS ();

    _user.LOGIN = “PRUEBAS”;

    _user.CLAVE = “123456”;

    _user.NOMBRE = “PRUEBA”;

     

    //VOY CON EL ROL:

     

    ELAG_ROLES _rol = new ELAG_ROLES ();

     _rol.IDROL = _rol.IDROL = _contexto.ELAG_ROLES.First(x => x.IDROL == 2).IDROL                                               

    _rol.NOMBREROL = _contexto.ELAG_ROLES.First(x => x.IDROL == 2).NOMBREROL;

    _rol.EntityKey = _contexto.ELAG_ROLES.First(x => x.IDROL == 2).EntityKey;

     

    //AGREGO EL ROL A MI OBJETO USUARIO

    _user.ELAG_ROLES.Add(_rol);

     //A MI CONTEXTO LE AGREGO EL OBJETO USUARIO YA CON LOS DATOS DEL USUARIO NUEVO Y EL ROL QUE YA EXISTE EN LA BASE DE DATOS.

    _contexto.AddToELAG_USUARIOS(_user);

    //PERO ME DA ESTA EXCEPCION

    // {System.InvalidOperationException: Ya existe un objeto con la misma clave en ObjectStateManager. ObjectStateManager no puede realizar el seguimiento de varios objetos con la misma clave.

     

    /*AHORA SI YO QUITARÁ ESTA LINEA:

    _rol.EntityKey = _contexto.ELAG_ROLES.First(x => x.IDROL == 2).EntityKey;

    SI PUEDO GUARDAR EL USUARIO PERO EN LA TABLA DE ROLES ME CREA UN NUEVO ROL Y YO NO QUIERO ESO.

    /*

    _contexto.SaveChanges();

                }

    Catch (Exception ex)

    {

    throw new SystemExceptions(ex);

    }

    }

     

    jueves, 9 de septiembre de 2010 10:10

Respuestas

  • Hola jose, que tal gracias por tu colaboración a la final pude resolver el problema, lo hice así, no se que te parece, el LINQ me parece muy potente pero hay veces que me enredada un poco como es la estructura, pero de verdad que las ventajas que obtienes con LINQ son ilimitadas, muchas gracias por tu respuesta.,, saludos.

     

     

    private void grabarUsuario

    {

    Try

    {

                            ELAG_USUARIOS   _user = new ELAG_USUARIOS ();

                            _user.LOGIN = “PRUEBAS”;

                           _user.CLAVE = “123456”;

                           _user.NOMBRE = “PRUEBA”;

                           //VOY CON EL ROL:

                           ELAG_ROLES _rol = new ELAG_ROLES ();

                           _rol = _contexto.elag_rol.first(x =>x.Id_Rol == 2);

                           //AGREGO EL ROL A MI OBJETO USUARIO

                          _user.ELAG_ROLES.Add(_rol);

                          //A MI CONTEXTO LE AGREGO EL OBJETO USUARIO YA CON LOS DATOS DEL USUARIO NUEVO Y EL ROL QUE YA EXISTE EN LA BASE DE DATOS.

                          _contexto.AddToELAG_USUARIOS(_user);

                          //LUEGO SALVO EL CONTEXTO, OBTENIENDO COMO RESULTADO UN NUEVO REGISTRO USUARIO CON UN ROL YA EXISTENTE EN BASE DE DATOS.

                         _contexto.SaveChanges();

                }

    Catch (Exception ex)

    {

                    throw new SystemExceptions(ex);

    }

    }

    • Marcado como respuesta Edgar Lagonell jueves, 16 de septiembre de 2010 10:40
    jueves, 16 de septiembre de 2010 10:40

Todas las respuestas

  • mira por lo general lo que se hace con entity framework es que se agrega lo del contexto al set de la tabla y despues se guardan cambios por ejemplo lo que yo podria hacer seria

     

    user.usuarios.AddObject();

     

    es del modo de agregar objetos al contexto y al guardarlos solo puede ser

     

    user.savechanges();

     

    la sintaxis es

     

    contexto.set.addobject();

     

    intenta esto, si no se resulve puedes contactarme en mi correo que es vargas.josedelangel@gmail.com y te puedo asesorar.

    domingo, 12 de septiembre de 2010 22:21
  • Hola jose, que tal gracias por tu colaboración a la final pude resolver el problema, lo hice así, no se que te parece, el LINQ me parece muy potente pero hay veces que me enredada un poco como es la estructura, pero de verdad que las ventajas que obtienes con LINQ son ilimitadas, muchas gracias por tu respuesta.,, saludos.

     

     

    private void grabarUsuario

    {

    Try

    {

                            ELAG_USUARIOS   _user = new ELAG_USUARIOS ();

                            _user.LOGIN = “PRUEBAS”;

                           _user.CLAVE = “123456”;

                           _user.NOMBRE = “PRUEBA”;

                           //VOY CON EL ROL:

                           ELAG_ROLES _rol = new ELAG_ROLES ();

                           _rol = _contexto.elag_rol.first(x =>x.Id_Rol == 2);

                           //AGREGO EL ROL A MI OBJETO USUARIO

                          _user.ELAG_ROLES.Add(_rol);

                          //A MI CONTEXTO LE AGREGO EL OBJETO USUARIO YA CON LOS DATOS DEL USUARIO NUEVO Y EL ROL QUE YA EXISTE EN LA BASE DE DATOS.

                          _contexto.AddToELAG_USUARIOS(_user);

                          //LUEGO SALVO EL CONTEXTO, OBTENIENDO COMO RESULTADO UN NUEVO REGISTRO USUARIO CON UN ROL YA EXISTENTE EN BASE DE DATOS.

                         _contexto.SaveChanges();

                }

    Catch (Exception ex)

    {

                    throw new SystemExceptions(ex);

    }

    }

    • Marcado como respuesta Edgar Lagonell jueves, 16 de septiembre de 2010 10:40
    jueves, 16 de septiembre de 2010 10:40