226 votes

Comment puis-je modifier les noms des tables lorsque j'utilise ASP.NET Identity ?

J'utilise la version release (RTM, pas RC) de Visual Studio 2013 (téléchargée sur MSDN 2013-10-18) et donc la dernière version (RTM) d'AspNet.Identity. Lorsque je crée un nouveau projet web, je sélectionne "Comptes d'utilisateurs individuels" pour l'authentification. Cela crée les tableaux suivants :

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

Lorsque j'enregistre un nouvel utilisateur (en utilisant le modèle par défaut), ces tables (listées ci-dessus) sont créées et la table AspNetUsers a un enregistrement inséré qui contient :

  1. Id
  2. Nom d'utilisateur
  3. PasswordHash
  4. Timbre de sécurité
  5. Discriminateur

De plus, en ajoutant des propriétés publiques à la classe "ApplicationUser", j'ai réussi à ajouter des champs supplémentaires à la table AspNetUsers, tels que "FirstName", "LastName", "PhoneNumber", etc.

Voici ma question. Existe-t-il un moyen de modifier le nom des tables ci-dessus (lors de leur création initiale) ou seront-elles toujours nommées avec l'identifiant AspNet préfixe comme je l'ai indiqué ci-dessus ? Si les noms des tables peuvent être nommés différemment, veuillez expliquer comment.

-- UPDATE --

J'ai mis en œuvre la solution de @Hao Kung. Elle crée bien une nouvelle table (par exemple, je l'ai appelée MyUsers), mais elle crée aussi toujours la table AspNetUsers. L'objectif est de remplacer la table "AspNetUsers" par la table "MyUsers". Voir le code ci-dessous et l'image de la base de données des tables créées.

Je voudrais en fait remplacer chaque AspNet table avec mon propre nom... Par exemple, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles, et MyUsers.

Comment puis-je réaliser cela et me retrouver avec un seul jeu de tableaux ?

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(): base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
    }
}

Database Tables

-- RÉPONSE À LA MISE À JOUR --

Merci à Hao Kung et Peter Stulinski. Cela a résolu mon problème...

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
    }

0 votes

Êtes-vous sûr ? Veuillez supprimer toutes vos tables, supprimez votre table _migration et essayez ensuite. Le code que j'ai posté ci-dessous, qui est très similaire au vôtre, ne crée pas la table AspNetUsers.

0 votes

Pour m'en assurer, j'ai supprimé toute la base de données, et même créé un nouveau projet web c# dans Visual Studio. Il crée toutes les tables AspNet et également la table MyUsers (comme illustré ci-dessus). Il crée la table _MigrationHistory et il y a un enregistrement inséré avec un MigrationId : "201310292106426_InitialCreate"

1 votes

La seule différence entre votre code et le mien est que j'ai renommé ApplicationUser en "User". Mon comportement est très différent. Lors de la première création, les tables sont créées selon les besoins et avec les noms que j'ai spécifiés..... Peut-être juste pour "l'expérimentation" essayez de changer ApplicationUser en User et ensuite ajoutez les lignes base.OnModelCreating(modelBuilder) ; modelBuilder.Entity<IdentityUser>() .ToTable("Users", "dbo") ; modelBuilder.Entity<ApplicationUser>() .ToTable("Users", "dbo") ;

1voto

Manish Points 76

Vous pouvez également créer des classes de configuration et spécifier chaque détail de chacune de vos classes d'identité, par exemple :

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

Et ensuite, inclure ces configurations dans la méthode OnModelCreating() :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

Vous aurez ainsi un contrôle total sur tous les aspects des classes d'identité.

1voto

Lucky Points 316

Mais cela ne fonctionne pas dans .NET CORE (MVC 6), pour cela nous devons changer la liaison en

comme

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityRole>().ToTable("Role");
    builder.Entity<IdentityUser>(entity => 
    {
        entity.ToTable("User");
        entity.Property(p => p.Id).HasColumnName("UserId");
    });
}

Cela pourrait aider quelqu'un :)

0 votes

Cela fonctionne-t-il pour le "code-first" et le "database-first" ?

0 votes

Je n'ai pas essayé pour la base de données d'abord, mais je suppose que cela devrait fonctionner si le modèle et la base de données sont les mêmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X