web-dev-qa-db-fra.com

Comment puis-je modifier les noms de table d'identité ASP.NET par défaut dans .NET CORE?

J'ai commencé avec .NET Core, dans MVC 5, j'ai modifié les noms de table par défaut, par exemple: AspNETUsers to Users, et cela a parfaitement fonctionné: Dans IdentityModels Class I dded:

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

        modelBuilder.Entity<IdentityUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }

Mais cela ne fonctionne pas dans .NET CORE (MVC 6). Quelqu'un peut-il m'aider? Merci beaucoup.

15
Archil Labadze

Essayez de changer de liaison en 

builder.Entity<ApplicationUser>(entity =>
       {
           entity.ToTable(name:"Users");
           entity.Property(e => e.Id).HasColumnName("UserId");

       });
14
Set

-Pour modifier les noms de ces tables (IdentityUserRole<Tkey>, IdentityUserToken<Tkey>, IdentityRoleClaim<Tkey>, IdentityUserClaim<Tkey>, IdentityUserLogin<Tkey>), vous devez spécifier le type de TKey (le type utilisé pour la clé primaire) qui est une chaîne (GUID) par défaut changes le. 

-Si vous souhaitez modifier la clé primaire de GUID en int https://medium.com/@goodealsnow/asp-net-core-identity-3-0-6018fc151b4

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);

        builder.Entity<ApplicationUser>(entity =>
        {
            entity.ToTable(name: "User");         
        });

        builder.Entity<IdentityRole>(entity =>
        {
            entity.ToTable(name: "Role");
        });
        builder.Entity<IdentityUserRole<string>>(entity =>
        {
            entity.ToTable("UserRoles");
          //in case you chagned the TKey type
          //  entity.HasKey(key => new { key.UserId, key.RoleId });
        });

        builder.Entity<IdentityUserClaim<string>>(entity =>
        {
            entity.ToTable("UserClaims");
        });

        builder.Entity<IdentityUserLogin<string>>(entity =>
        {
            entity.ToTable("UserLogins");
             //in case you chagned the TKey type
          //  entity.HasKey(key => new { key.ProviderKey, key.LoginProvider });       
 });

        builder.Entity<IdentityRoleClaim<string>>(entity =>
        {
            entity.ToTable("RoleClaims");

        });

        builder.Entity<IdentityUserToken<string>>(entity =>
        {
            entity.ToTable("UserTokens");
            //in case you chagned the TKey type
           // entity.HasKey(key => new { key.UserId, key.LoginProvider, key.Name });

        });
    }
16
Ahmed Al Jabry

Une liste complète pour ASP.Net Core 2/2.1, basée sur la réponse de @ ahmed-al-jabry.

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

    modelBuilder.Entity<User>(entity => { entity.ToTable(name: "User"); });
    modelBuilder.Entity<IdentityRole>(entity => { entity.ToTable(name: "Role"); });
    modelBuilder.Entity<IdentityUserRole<string>>(entity => { entity.ToTable("UserRoles"); });
    modelBuilder.Entity<IdentityUserClaim<string>>(entity => { entity.ToTable("UserClaims"); });
    modelBuilder.Entity<IdentityUserLogin<string>>(entity => { entity.ToTable("UserLogins"); });
    modelBuilder.Entity<IdentityUserToken<string>>(entity => { entity.ToTable("UserToken"); });
    modelBuilder.Entity<IdentityRoleClaim<string>>(entity => { entity.ToTable("RoleClaim"); });
}
2
Andriod

Deux autres étapes sont nécessaires pour appliquer les modifications:

  • Appliquer Add-Migration
  • Mise à jour de la base de données
1
Yawar Ali

J'ajoute une deuxième réponse, car de nombreuses personnes vont y répondre en essayant de changer les noms de table dans .NET Core 2.1

Le processus est bien expliqué dans Microsoft docs

Pour ceux qui ont besoin d'une solution rapide:

  1. Héritez de tous vos modèles que vous souhaitez modifier (l'autorisation Microsoft par défaut est fournie avec 7 modèles). Par exemple, en modifiant AspNetUsers en utilisateur et AspNetRoles en rôle, vous pouvez effectuer les opérations suivantes dans vos modèles existants:

    public partial class User : IdentityUser<int>
    {
        // code
    }
    
    public partial class Role : IdentityRole<int>
    {
        // code
    }
    

Dans cet exemple, je modifie également le type de clé primaire, car la valeur par défaut est nvarchar.

  1. Dans votre contexte, héritez d'IdentityDbContext et utilisez le même type comme argument:

    public class AppDbContext : IdentityDbContext<User, Role, int>
    {
        // code
    }
    
  2. Ensuite, nous devons mettre à jour ConfigureServices dans StartUp pour utiliser la nouvelle classe User:

     services.AddDefaultIdentity<User, Role>()
     .AddEntityFrameworkStores<AppDbContext>();
    

Ensuite, si vous avez besoin de migrer pour mettre à jour/créer une base de données. Cela dépend s'il s'agit d'un projet nouveau ou ancien.

Remarque: Si vous utilisez actuellement une authentification dans votre projet telle que UserManager ou SignInManager, vous devez remplacer leurs arguments génériques par les nouveaux comme ceci:

SignInManager<User>
UserManager<User>

J'espère que cela pourra aider :)

0
Ivaylo Dimitrov