Duplica llave en membresía

Cuando creo un nuevo miembro se me esta moviendo 3 tablas aspnet_Membership, aspnet_Users, aspnet_UserInRoles
En la primera Tabla aspnet_Membership coloca en el campo UserId=123
y lo enlaza con la segunda aspnet_Users y coloca en los campos UserId=123, UserName=XXX
y finalmente con la tabla aspnet_UserInRoles y coloca en el campo UserId=123
Con el código que tengo actualmente que es el siguiente me esta doblando la información en la base de datos de membresía pero solo en las tablas aspnet_Users, aspnet_UserInRoles osea que me esta creando ademas en la tabla de aspnet_Users un nuevo registro con el mismo UserName y con diferente UserId y lo mismo pasa con la tabla aspnet_UserInRoles
Ejemplo:
aspnet_Membership
UserId
123
aspnet_Users
UserId UserName
123 XXX
456 XXX
aspnet_UserInRoles
UserId
123
456
El problema surge cuando borro pues el solo me va a tomar el UserId=123 y me va a dejar en las tablas aspnet_Users, aspnet_UserInRoles el UserId=456 y en la tabla de aspnet_Users el campo UserName=XXX y supuestamente esta eliminado y cuando voy a hacer una inclusion con el mismo nombre pues marca error puesto que UserName=XXX ya se encuentra en la tabla aspnet_Users.
El código actual es el siguiente a mi me parece que esta bien pero no se porque se me duplica:
Try
Membership.CreateUser(TextLogin.Text, TextPassword.Text, TextEmail.Text)
Roles.AddUserToRole(TextLogin.Text, "Artista")
Catch ex As MembershipCreateUserException
LabelError.Visible = True
LabelError.Text = GetErrorMessage(ex.StatusCode)
Exit Sub
End Try
Debido a esto que no le encuentro explicación decidí borrar el registro de más en el evento rowdeleting del gridview con el siguiente código pero el hp en la variable res1 me bota dizq el valor de res1=XXX cuando en el SELECT llamado sql1 estoy es preguntando por el UserId y no por el UserName y por eso cuando hago el DELETE del sql2 se totea.
Este es el código si hay algo mal me dice please
Dim x As String = e.Keys(0).ToString
conn.Open()
Dim sql As String = "SELECT UserName FROM aspnet_Users WHERE UserName = @UserName"
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.Add("UserName", Data.SqlDbType.NVarChar)
cmd.Parameters.Item(0).Value = x
Dim res As String = cmd.ExecuteScalar.ToString
Membership.DeleteUser(res)
'me borra correctamente el UserId=123 pero me deja el UserId=456 y UserName=XXX
Dim sql1 As String = "SELECT UserId FROM aspnet_Users WHERE UserName = @UserName1"
Dim cmd1 As New SqlCommand(sql1, conn)
cmd1.Parameters.Add("UserName1", Data.SqlDbType.NVarChar)
cmd1.Parameters.Item(0).Value = x
Dim res1 As String = cmd.ExecuteScalar.ToString
Dim sql2 As String = "DELETE FROM aspnet_UsersInRoles WHERE UserId = @UserId"
Dim cmd2 As New SqlCommand(sql2, conn)
cmd2.Parameters.Add("UserId", Data.SqlDbType.NVarChar)
cmd2.Parameters.Item(0).Value = res1
cmd2.ExecuteNonQuery()
'aqui el hp me bota dizq res1=XXX y no hace el DELETE
Dim sql3 As String = "DELETE FROM aspnet_Users WHERE UserName=@username3"
Dim cmd3 As New SqlCommand(sql3, conn)
cmd3.Parameters.Add("username3", Data.SqlDbType.NVarChar)
cmd3.Parameters.Item(0).Value = res
cmd3.ExecuteNonQuery()
Espero pronta respuesta...

1 respuesta

Respuesta
1
La verdad es que es un poco lioso, bueno es normal que con un delete por el userid no te borre los que tienen distinto userid. Si tienes la posibilidad lo mejor que puedes hacer es activarle el delete cascade en la BBDD a las tablas hijas, para que si se borra un registro en la padre la BBDD elimine los dependientes de forma automática ( es las más rapido y seguro). Lo que no acab de entender es lo que comentas al princicio, eso de que creas un resitro y el te crea 2. Eso no debería pasar y solo se me ocurre que tengas en la BBDD un trigger que te los cree o que tengas algo de código mal que lo haga, pero lo que me has pegado es correcto. Bueno puedes explicarte mejor con lo que crees que esta pasando. Por cierto si los parámetros son cadenas de textos puedes usar el & para concatenarlas y ahorrarte el paso de parámetros a los comandos, que es bastante lento.
Primero que todo gracias por contestar oportunamente... quisiera saber como hago entonces para habilitar el borrado en cascada en la base de datos hecha en sqlserver2005... con respecto a lo segundo si exactamente lo que estoy escribiendo me esta sucediendo me esta duplicando la información en el campoUserName de la tabla aspnet_Users y el código que he copiado es el que se esta ejecutando...:(
Espero pronta respuesta...
Te pego un link para que veas como se habilita el borrado en cascada en una tabla:
http://www.informit.com/guides/content.asp?g=sqlserver&seqNum=53&rl=1
o este otro (aunque ponga que para moviles te sirve de todas formas).
http://msdn2.microsoft.com/en-us/library/ms174123.aspx
Si miras en este ultimo encontraras la solución al otro problema. Tienes que tener activado en las tablas hijas el update cascade, que te inserta un registro en estas tablas cada vez que creas uno nuevo en la padre, si quieres puedes desactivarlo o, esto será lo mejor, en vez de hacer insert en la tabla hacer update sobre el registro recién creado por la PORQUE que tienes de la inserción en la tabla padre. Espero haberme explicado. Un saludo y no te olvides de finalizar.
Si la no necesitas más aclaraciones finaliza la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas