我正在使用Visual Studio 2013的发布版本(RTM,而不是RC)(从MSDN 2013-10-18下载),因此使用AspNet.Identity的最新版本(RTM)。当我创建一个新的Web项目时,我选择“个人用户帐户”进行身份验证。这将创建以下表格:
当我注册一个新用户(使用默认模板)时,会创建这些表(如上所列),并且AspNetUsers表中插入的记录包含:
此外,通过向“ApplicationUser”类添加公共属性,我已成功向AspNetUsers表添加了其他字段,例如“FirstName”,“LastName”,“PhoneNumber”等。
这是我的问题。有没有办法更改上面表格的名称(首次创建它们时)或者它们是否总是以我上面列出的AspNet
前缀命名?如果表名可以不同的名称,请解释如何。
- 更新 -
我实施了@Hao Kung的解决方案。它确实创建了一个新表(例如我称之为MyUsers),但它仍然创建了AspNetUsers表。目标是用“MyUsers”表替换“AspNetUsers”表。请参阅下面的代码和创建的表的数据库图像。
我实际上想用我自己的名字替换每个AspNet
表...例如,MyRoles,MyUserClaims,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");
}
}
- 更新答案 -
感谢Hao Kung和Peter Stulinski。这解决了我的问题...
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 :(得分:121)
您可以通过修改IdentityModel.cs轻松完成此操作:
在DbContext中覆盖OnModelCreating,然后添加以下内容,这会将AspNetUser表更改为“Users”,您还可以更改字段名称,默认Id列将成为User_Id。
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
或者如果您想保留所有标准列名,只需使用以下内容:
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "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");
}
}
请注意,如果当前表存在,我无法使其正常工作。另请注意,如果您没有映射任何列,则会创建默认列。
希望有所帮助。
答案 1 :(得分:55)
以下是我的工作解决方案:
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();
}
}
有关详细信息,请参阅this
答案 2 :(得分:15)
您可以尝试在DbContext类中重写此方法,将其映射到您选择的表中:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers");
答案 3 :(得分:2)
仅出于文档目的,对于未来几年来此帖子的人(例如XD),我评论中给出的所有答案都是正确的,但是您可以使用Alexandru Bucur给出的这种方法来简化在他的博客上
//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));
}
}
答案 4 :(得分:0)
我们可以像这样更改asp.net Identity默认表名:
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");
}
}
此外,我们可以扩展每个类,并将任何属性添加到类,例如“IdentityUser&#39;”,“IdentityRole&#39;”,...
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
}
为节省时间,我们可以使用AspNet Identity 2.0 Extensible Project Template扩展所有课程。
答案 5 :(得分:0)
您还可以创建配置类并指定每个Identity类的每个详细信息,例如:
using System.Data.Entity.ModelConfiguration;
public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
public UserConfig()
{
ToTable("Users");
Property(u => u.LocationName).IsRequired();
}
}
然后在OnModelCreating()方法中包含这些配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new ApplicationUserConfig());
...
}
这将使您可以完全控制Identity类的各个方面。
答案 6 :(得分:0)
但是它在.NET CORE(MVC 6)中不起作用,因为我们需要将绑定更改为
喜欢
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<ApplicationRole>(entity =>
{
entity.ToTable(name:"Role");
entity.Property(e => e.Id).HasColumnName("RoleId");
});
}
这可能会帮助某人:)