web-dev-qa-db-fra.com

Comment puis-je changer les noms de table lorsque j'utilise ASP.NET Identity?

J'utilise la version de publication (RTM, pas RC) de Visual Studio 2013 (téléchargée à partir de 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 tables suivantes:

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

Lorsque j'enregistre un nouvel utilisateur (à l'aide du modèle par défaut), ces tables (répertoriées ci-dessus) sont créées et la table AspNetUsers contient un enregistrement contenant:

  1. Id
  2. UserName
  3. PasswordHash
  4. SecurityStamp
  5. Discriminateur

De plus, en ajoutant des propriétés publiques à la classe "ApplicationUser", j'ai ajouté des champs supplémentaires à la table AspNetUsers, tels que "Prénom", "Nom", "PhoneNumber", etc.

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

- UPDATE -

J'ai implémenté la solution de @Hao Kung. Il crée une nouvelle table (par exemple, je l'ai appelée MyUsers), mais il crée également 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.

En fait, j'aimerais remplacer chaque table AspNet par mon propre nom ... Par exemple, par exemple, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles et MyUsers.

Comment puis-je accomplir cela et me retrouver avec un seul ensemble de tables?

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

- UPDATE REPONSE -

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");
    }
203
user2315985

Vous pouvez le faire facilement en modifiant IdentityModel.cs comme indiqué ci-dessous:

Remplacez OnModelCreating dans votre DbContext puis ajoutez ce qui suit, cela changera la table AspNetUser en "Utilisateurs". Vous pouvez également changer les noms de champ. La colonne Id par défaut deviendra User_Id.

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

ou simplement ci-dessous si vous souhaitez conserver tous les noms de colonnes standard:

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

Exemple complet ci-dessous (il devrait figurer dans votre fichier IdentityModel.cs). J'ai modifié la classe ApplicationUser pour qu'elle s'appelle Utilisateur.

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

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

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

Veuillez noter que je n'ai pas réussi à faire fonctionner ce système si le tableau actuel existe. Notez également les colonnes que vous ne mappez pas, celles par défaut seront créées.

J'espère que ça t'as aidé.

121
Piotr Stulinski

Voici ma solution de travail:

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

        modelBuilder.Entity<ApplicationUser>().ToTable("User");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

Voir this pour plus de détails

57
Frank Myat Thu

Vous pouvez essayer de surcharger cette méthode dans votre classe DbContext pour la mapper sur une table de votre choix:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");
15
Hao Kung

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, incluez ces configurations dans la méthode OnModelCreating ():

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

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

Cela vous donnera un contrôle complet sur tous les aspects des classes d'identité.

1
Manish

Nous pouvons changer les noms de table par défaut d'ASP.net Identity comme ceci:

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

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

De plus, nous pouvons étendre chaque classe et ajouter n'importe quelle propriété à des classes telles que 'IdentityUser', 'IdentityRole', ...

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    // Add additional items here as needed
}

Pour gagner du temps, nous pouvons utiliser Modèle de projet AspNet Identity 2.0 Extensible pour étendre toutes les classes.

0
Arvand

Mais cela ne fonctionne pas dans .NET CORE (MVC 6) car 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
dnxit