none
Instrucción INSERT en conflicto con la restricción FOREIGN KEY

    Pregunta

  • Hola, siguiendo con la implementacion de los roles de Usuario y tomando como base el código de CustomRoleProvider , donde utilizo un createuserwizard para poder crear al usuario.

    http://geeks.ms/blogs/mrubino/archive/2008/01/27/custom-membershipprovider-y-roleprovider.aspx

    Me encuentro con el siguiente error.

    Instrucción INSERT en conflicto con la restricción FOREIGN KEY "FK_UsuariosPorRol_Roles". El conflicto ha aparecido en la base de datos "BDLocal", tabla "dbo.Roles", column 'IDRol'.

    La estructura de mis tabla es esta:

    Este es el metodo que me crea la excepcion:

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
            {
                #region Validación de los Roles
                foreach (string rolename in roleNames)
                {
                    if (!RoleExists(rolename))
                    {
                        throw new ProviderException("El Rol no Existe.");
                    }
                }
                #endregion Validación de los Roles

                #region validación de los Usuarios
                foreach (string username in usernames)
                {
                    if (username.Contains(","))
                    {
                        throw new ArgumentException("Los Nombres de usuario no pueden contener comas.");
                    }

                    foreach (string rolename in roleNames)
                    {
                        if (IsUserInRole(username, rolename))
                        {
                            throw new ProviderException("El usuario ya pertenece al Rol.");
                        }
                    }
                }
                #endregion validación de los Usuario

                SqlCommand command = new SqlCommand();
                SqlTransaction tran = null;

                try
                {
                    command.Connection = connection;
                    command.CommandText = @"INSERT INTO UsuariosPorRol
                                        (IDUsuario, IDRol)
                                            SELECT Roles.IDRol, Usuarios.IDUsuario
                                            FROM Roles, Usuarios
                                        WHERE (Usuarios.Nombre = @Username)
                                        AND (Roles.Rol = @RolName) ";

                    command.Parameters.Add("@Username", SqlDbType.VarChar, 100);
                    command.Parameters.Add("@RolName", SqlDbType.VarChar, 50);


                    command.Connection.Open();
                    tran = command.Connection.BeginTransaction();
                    command.Transaction = tran;

                    foreach (string username in usernames)
                    {
                        foreach (string rolename in roleNames)
                        {
                            command.Parameters["@Username"].Value = username;
                            command.Parameters["@RolName"].Value = rolename;
                            command.ExecuteNonQuery();
                        }
                    }

                    tran.Commit();

                }
                catch
                {
                    tran.Rollback();
                }
                finally
                {
                    if (command.Connection != null)
                    {
                        if (command.Connection.State == ConnectionState.Open)
                            command.Connection.Close();
                    }
                }

            }

    E probado cambiando lo de la replicacion de la foreignkey dfe la Table UsuariosPorRol en la base de datos, y los datos se me insertan al reves, es decir, el Id de Rol en el De usuario y viceversa.

    martes, 03 de enero de 2012 2:52

Respuestas

  • hola

    es que no deberias armar tu mismo al INSERT a la tabla UsuariosPorRol, deberias usar las librerias

    quizas el metodo

    AddUserToRole

    AddUserToRoles

    ademas esta bastante raro ese codigo que implementas, es un INSERT con un SELECT dentro del mismo

    tiene dos parametro a los cuales los asignas dentro de un foreach, la verdad muy raro, recomendaria analises el uso de la clase que menciono porque es esta funcionalidad la que deberias usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 03 de enero de 2012 3:26
  • si, aparte de las recomendaciones de Leandro, tu sentencia sql hace un INSERT desde un SELECT, pero tienes los campos al reves

     

    INSERT INTO UsuariosPorRol(IDUsuario, IDRol) SELECT Roles.IDRol, Usuarios.IDUsuario

    Deberia ser

    INSERT INTO UsuariosPorRol(IDUsuario, IDRol) SELECT Usuarios.IDUsuario, Roles.IDRol

     

    Saludos

     

    martes, 03 de enero de 2012 12:28

Todas las respuestas

  • hola

    es que no deberias armar tu mismo al INSERT a la tabla UsuariosPorRol, deberias usar las librerias

    quizas el metodo

    AddUserToRole

    AddUserToRoles

    ademas esta bastante raro ese codigo que implementas, es un INSERT con un SELECT dentro del mismo

    tiene dos parametro a los cuales los asignas dentro de un foreach, la verdad muy raro, recomendaria analises el uso de la clase que menciono porque es esta funcionalidad la que deberias usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 03 de enero de 2012 3:26
  • si, aparte de las recomendaciones de Leandro, tu sentencia sql hace un INSERT desde un SELECT, pero tienes los campos al reves

     

    INSERT INTO UsuariosPorRol(IDUsuario, IDRol) SELECT Roles.IDRol, Usuarios.IDUsuario

    Deberia ser

    INSERT INTO UsuariosPorRol(IDUsuario, IDRol) SELECT Usuarios.IDUsuario, Roles.IDRol

     

    Saludos

     

    martes, 03 de enero de 2012 12:28