C# 使用ASP.NET标识时如何更改表名?
我使用的是Visual Studio 2013的发布版本(RTM,而不是RC)(从MSDN 2013-10-18下载),因此是AspNet.Identity的最新(RTM)版本。当我创建一个新的web项目时,我选择“个人用户帐户”进行身份验证。这将创建以下表格: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表插入了一条
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));
}
}