Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NET标识时如何更改表名?_C#_Asp.net Identity - Fatal编程技术网

C# 使用ASP.NET标识时如何更改表名?

C# 使用ASP.NET标识时如何更改表名?,c#,asp.net-identity,C#,Asp.net Identity,我使用的是Visual Studio 2013的发布版本(RTM,而不是RC)(从MSDN 2013-10-18下载),因此是AspNet.Identity的最新(RTM)版本。当我创建一个新的web项目时,我选择“个人用户帐户”进行身份验证。这将创建以下表格: AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRoles 网络用户 当我注册一个新用户(使用默认模板)时,将创建这些表(上面列出),并且AspNetUsers表插入了一条

我使用的是Visual Studio 2013的发布版本(RTM,而不是RC)(从MSDN 2013-10-18下载),因此是AspNet.Identity的最新(RTM)版本。当我创建一个新的web项目时,我选择“个人用户帐户”进行身份验证。这将创建以下表格:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • 网络用户
  • 当我注册一个新用户(使用默认模板)时,将创建这些表(上面列出),并且AspNetUsers表插入了一条记录,其中包含:

  • 身份证
  • 用户名
  • 密码哈希
  • 证券印花
  • 鉴别器
  • 此外,通过向类“ApplicationUser”添加公共属性,我已成功地将其他字段添加到AspNetUsers表中,如“FirstName”、“LastName”、“PhoneNumber”等

    这是我的问题。是否有办法更改上述表格的名称(当它们第一次创建时),或者它们将始终使用上面列出的
    AspNet
    前缀命名?如果表名可以不同命名,请解释如何命名

    --更新--

    我实施了@Hao Kung的解决方案。它确实创建了一个新表(例如我称之为MyUsers),但它仍然创建了AspNetUsers表。目标是将“AspNetUsers”表替换为“MyUsers”表。请参阅下面的代码和创建的表的数据库映像

    实际上,我想用我自己的名字替换每个
    AspNet
    表。。。对于fxample、MyRoles、MyUserClaimes、MyUserLogins、MyUserRoles和MyUsers

    我如何做到这一点,最终只得到一组表

    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");
        }
    }
    
    公共类应用程序用户:IdentityUser
    {
    公共字符串名{get;set;}
    公共字符串LastName{get;set;}
    公共字符串地址1{get;set;}
    公共字符串地址2{get;set;}
    公共字符串City{get;set;}
    公共字符串状态{get;set;}
    公共字符串PostalCode{get;set;}
    公共字符串PhonePrimary{get;set;}
    公共字符串{get;set;}
    }
    公共类ApplicationDbContext:IdentityDbContext
    {
    public ApplicationDbContext():基本(“DefaultConnection”)
    {
    }
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    基于模型创建(modelBuilder);
    modelBuilder.Entity().ToTable(“MyUsers”);
    }
    }
    

    --更新答案--

    多亏了龚浩和彼得·斯图林斯基。这解决了我的问题

        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");
        }
    
    protectedoverride void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
    基于模型创建(modelBuilder);
    modelBuilder.Entity().ToTable(“MyUsers”).Property(p=>p.Id).HasColumnName(“UserId”);
    modelBuilder.Entity().ToTable(“MyUsers”).Property(p=>p.Id).HasColumnName(“UserId”);
    modelBuilder.Entity().ToTable(“MyUserRoles”);
    modelBuilder.Entity().ToTable(“MyUserLogins”);
    modelBuilder.Entity().ToTable(“MyUserClaims”);
    modelBuilder.Entity().ToTable(“MyRoles”);
    }
    
    您可以尝试在DbContext类中重写此方法,以将其映射到您选择的表:

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            modelBuilder.Entity<IdentityUser>()
                .ToTable("AspNetUsers");
    
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
    modelBuilder.Entity()
    .ToTable(“AspNetUsers”);
    
    您可以根据以下内容修改IdentityModel.cs,轻松完成此操作:

    在DbContext中重写OnModelCreating,然后添加以下内容,这会将AspNetUser表更改为“Users”,您还可以更改字段名称,默认Id列将变为User\u Id

    modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
    
    modelBuilder.Entity()
    .ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
    
    如果您想保留所有标准列名,也可以使用下面的选项:

    modelBuilder.Entity<IdentityUser>()
                            .ToTable("Users", "dbo")
    
    modelBuilder.Entity()
    .ToTable(“用户”、“dbo”)
    
    下面的完整示例(应该在IdentityModel.cs文件中)我将ApplicationUser类更改为User

    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");
            }
        }
    
    公共类用户:IdentityUser
    {
    公共字符串PasswordOld{get;set;}
    public DateTime DateCreated{get;set;}
    公共bool已激活{get;set;}
    公共bool用户角色{get;set;}
    }
    公共类ApplicationDbContext:IdentityDbContext
    {
    公共应用程序上下文()
    :base(“默认连接”)
    {
    }
    模型创建时受保护的覆盖无效(System.Data.Entity.DbModelBuilder modelBuilder)
    {
    基于模型创建(modelBuilder);
    modelBuilder.Entity()
    .ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
    modelBuilder.Entity()
    .ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
    }
    }
    
    请注意,如果当前表存在,我无法使其正常工作。请注意,将创建任何未映射默认列的列


    希望能有所帮助。

    以下是我的工作解决方案:

    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();
        }
    }
    

    public class ApplicationDbContext:IdentityDbContext有关详细信息

    我们可以更改asp.net标识默认表名,如下所示:

        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");
            }
        }
    
    public类ApplicationDbContext:IdentityDbContext
    {    
    public ApplicationDbContext():基本(“DefaultConnection”)
    {
    }
    模型创建时受保护的覆盖无效(System.Data.Entity.DbModelBuilder modelBuilder)
    {
    基于模型创建(modelBuilder);
    modelBuilder.Entity().ToTable(“用户”);
    
    modelBuilder.Entity来扩展所有类。

    您还可以创建配置类并指定每个标识类的每个细节,例如:

    using System.Data.Entity.ModelConfiguration;
    
    public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
    {
        public UserConfig()
        {
            ToTable("Users");
            Property(u => u.LocationName).IsRequired();
        }
    }
    
    这将使您能够完全控制标识类的各个方面。

    但确实如此
    using System.Data.Entity.ModelConfiguration;
    
    public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
    {
        public UserConfig()
        {
            ToTable("Users");
            Property(u => u.LocationName).IsRequired();
        }
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Configurations.Add(new ApplicationUserConfig());
            ...
        }
    
    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");
        });
    }
    
             //But this method is not longer supported on netcore > 2.2, so I need to fix it
             foreach (var entityType in modelBuilder.Model.GetEntityTypes())
             {
                var table = entityType.Relational().TableName;
                 if (table.StartsWith("AspNet"))
                 {
                     entityType.Relational().TableName = table.Substring(6);
                 }
             };
    
            //This is the functional way on NetCore > 2.2
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                var tableName = entityType.GetTableName();
                if (tableName.StartsWith("AspNet"))
                {
                    entityType.SetTableName(tableName.Substring(6));
                }
            }