Documente Academic
Documente Profesional
Documente Cultură
NET IDENTITY
RodriguezWeb
Bien, veamos ahora como podemos aadir un campo adicional a esta tabla.
El template de VS2013 nos crea una clase llamada ApplicationUser que ya hereda de IdentityUser. Dicha clase est
vaca y est pensada para que nosotros aadamos los campos necesarios. Tambin nos crea un contexto de EF
(llamado ApplicationDbContext) que hereda de IdentityDbContext<ApplicationUser>. Es decir, nos da casi todo el
trabajo hecho :)
Pgina 1
RodriguezWeb
Para no ser originales, vamos a hacer el ejemplo clsico que encontrars en cualquier post: aadir la fecha de
nacimiento. Para ello nos basta con aadir dicho campo en la clase ApplicationUser:
public class ApplicationUser : IdentityUser
{
public string nombres { get; set; }
}
Si ahora ejecutas de nuevo la aplicacin, seguramente te dar el siguiente error: The model backing the
'ApplicationDbContext' context has changed since the database was created. Consider using Code First Migrations to
update the database (http://go.microsoft.com/fwlink/?LinkId=238269)
Esto es porque se ha modificado el esquema de datos y ahora tenemos un cdigo que no se corresponde a la BBDD.
Tenemos dos opciones: o eliminar la BBDD (y perder todos los datos) o usar Migrations. Para usar Migrations tenemos
que habilitarlas primero mediante el Package Manager Console, tecleando Enable-Migrations. Una vez las tengas
habilitadas debemos:
1.
2.
Aadir una migracin que refleje el cambio realizado en ApplicationUser, usando Add-Migration
<nombre_migracion> en el Package Manager Console
Actualizar la BBDD usando Update-Database en el Package Manager Console.
En mi caso cuando he tecleado Add-Migration AddBirthday me ha generado dentro de una carpeta Migrations el
archivo de migracin. Dicho archivo es una clase C# que le indica a Migrations que hacer. Se genera automticamente
comparando el esquema de la BBDD con el esquema que tendra que haber segn la clases de EF code first. Para
que veas, en mi caso la clase de migracin contiene el siguiente cdigo:
public partial class AgregarColumna : DbMigration
{
public override void Up()
{
AddColumn("dbo.AspNetUsers", "nombres", c => c.String());
}
public override void Down()
{
DropColumn("dbo.AspNetUsers", "nombres");
}
}
Puedes ver que lo que har es aadir la columna BirthDay. Insisto: dicha clase se genera automticamente al hacer
Add-Migration. Cuando ejecutes Update-Database, se aplicarn los cambios indicados.
As que bueno lo nico que te queda es esto, ejecutar el comando Update-Database desde el Package Manager
Console. Cuando lo apliques vers algo parecido a esto:
Listos Si ahora miras el esquema de la tabla AspNetUsers vers que tenemos ya el nuevo campo:
Fcil y sencillo. La verdad, comparado con lo que se tena que hacer para conseguir lo mismo con el Membership es
una maravilla :P
Cambiar el esquema
Vale aadir campos es sencillo (hemos visto el ejemplo clsico que es la tabla de usuarios, para el resto de tablas es
lo mismo pero con otras clases). Pero y cambiar el esquema? Si quiero que la tabla AspNetUsers se llame
simplemente Users y que PasswordHash se llame Pwd p. ej.? Que tenemos que hacer?
Pgina 2
RodriguezWeb
Pues bien, eso tambin es posible gracias al uso de EF Code First. En este caso vamos a tener que tocar el contexto
de EF (la clase ApplicationDbContext en el caso de cdigo generado por VS2013), en concreto redefinir el mtodo
OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>().ToTable("Users").
Property(u => u.PasswordHash).HasColumnName("Pwd");
modelBuilder.Entity<ApplicationUser>().ToTable("Users").
Property(u => u.PasswordHash).HasColumnName("Pwd");
}
Y ahora el esquema que tengo en la BBDD es (mantengo mi clase ApplicationUser con la propiedad BirthDay):
De nuevo comparado con lo que se tena que hacer con el antiguo Membership es una maravilla.
El tipo de cambios que puedes hacer vienen limitados por EF Code First, pero en general estamos ante un modelo
mucho ms flexible que el anterior Membership.
En resumen, a pesar de que ASP.NET Identity tiene varias cosillas que no me gustan (o mejor dicho, realmente varias
cosas que echo en falta) es sin duda un paso adelante respecto al anterior Membership. Me sigue quedando la duda de
si lo que ofrece es suficiente para segn que tipo de webs, pero si las funcionalidades que ofrece te son suficientes y
no te importa ajustar tu esquema a algunos detalles menores (como esos Id de usuario de tipo string) es un avance
muy significativo respecto a Membership.
Pgina 3