Fran Otero

Programación C#, ASP.NET,SqlServer, Mobile y electrónica.

Asociar tabla a aspnet_users

A pesar de no tener ninguna complicación especial, son muchos los programadores que utilizan enlaces no naturales para vincular tablas con el sistema de usuarios de ASP.NET.  En la jerarquía de tablas instalada, la tabla de usuarios ASPNET_Users tiene como clave primaria la columna UserId y esa será la columna que debamos de utilizar para enlazar con el resto de tablas.

El problema es que esta columna es un GUID, característica que hace que nos pueda parecer poco idónea para utilizarla como clave foránea. Las alternativas que tenemos como claves candidatas en la tabla de usuarios es la combinación de 'LoweredUserName' y 'ApplicationId'. Aún en el caso de que ignoremos 'ApplicationId' por utilizar la base de datos para una única aplicación, el campo LoweredUserName es de tipo varchar(256), mucho mayor que un GUID y desde luego mucho menos adecuado para utilizar como clave externa.

Veamos un ejemplo básico de como se personaliza un control CreateUserWizard para añadir información personalizada en una tabla viculada con la estructura de Membership.

1.- Diseño de la tabla: la clave primaria coincide con el campo UserId de ASPNET_Users. En este sencillo ejemplo vamos a guardar el nombre, apellido y fecha de nacimiento.

2.- Añadimos un paso más al control para solicitar la información adicional:

 3.- Controlamos la navegación en el primer paso del Wizard, que sigue siendo el paso de creación del usuario:

4.- Guardamos la información adicional al finalizar el asistente. Evidentemente podemos utilizar cualquier tecnología de acceso a datos aunque para mayor claridad haya escogido la más básica.

 Fíjate que este código es independiente del proveedor del Membership Provider que utilicemos, ya que la propiedad ProviderUserKey devuelve un objeto con la clave primaria del proveedor. En nuestro caso esta clave primaria es el UserId de tipo Guid, para otros proveedores puede ser cualquier otra cosa.

Posted: 14/6/2011 9:45 por Fran Otero Otero | con 5 comment(s)
Comparte este post:

Comentarios

fravelgue ha opinado:

Tu afirmación, "El problema es que esta columna es un GUID, característica que hace que nos pueda parecer poco idónea para utilizarla como clave foránea"

Me he hecho replantearme algunas cosa.

# June 14, 2011 2:51 PM

Fran Otero Otero ha opinado:

¿Por qué lo dices? A pesar de lo que se puede leer en algunos sitios, una columna uniqueidentifier o GUID no es en absoluto una mala elección como clave de tabla.

El único caso en que es realmente desaconsejable es en caso de querer hacer un índice cluster en una tabla donde primen las inserciones, ya que normalmente se utilizan valores aleatorios que se insertarían "en medio" de los datos existentes repaginando índices continuamente. Aún en ese caso podemos utilizar GUIDs secuenciales.

# June 15, 2011 9:32 AM

fravelgue ha opinado:

Por eso justamente que comentas :-).

stackoverflow.com/.../2996194

# June 15, 2011 1:43 PM

ricardo ha opinado:

amigo un favor, podrias pasar el codigo que utilizaste para el wizardstep o si podrias proporcionar el codigo de este ejemplo se te agradeceria.

Saludos.

# July 27, 2011 1:16 AM