我正在尝试自定义IdentityUser以生成主键作为整数并更改表名。 问题是:正确生成主键,并且使用新名称迁移正确创建所有标准表,但用户名除外。当我应用Add-Migration Comand时,它返回两个“用户表”。
这是我的代码。
我的自定义标识类
public class User : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
}
public class CustomUserRole : IdentityUserRole<int> { }
public class CustomUserClaim : IdentityUserClaim<int> { }
public class CustomUserLogin : IdentityUserLogin<int> { }
public class CustomRole : IdentityRole<int, CustomUserRole>
{
public CustomRole() { }
public CustomRole(string name) { Name = name; }
}
我的ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
public ApplicationDbContext() : base("CONNSTRING") { }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("Users", "dbo");
modelBuilder.Entity<CustomRole>().ToTable("Role","dbo");
modelBuilder.Entity<CustomUserRole>().ToTable("UserRole", "dbo");
modelBuilder.Entity<CustomUserLogin>().ToTable("UserLogin", "dbo");
modelBuilder.Entity<CustomUserClaim>().ToTable("UserClaims", "dbo");
}
}
由EF生成的脚本,您可以看到它生成两个“用户表”:标准的“AspNetUsers”和我的自定义“用户”。
public partial class teste : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Role",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"dbo.UserRole",
c => new
{
UserId = c.Int(nullable: false),
RoleId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("dbo.Role", t => t.RoleId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.Int(nullable: false, identity: true),
Email = c.String(maxLength: 256),
EmailConfirmed = c.Boolean(nullable: false),
PasswordHash = c.String(),
SecurityStamp = c.String(),
PhoneNumber = c.String(),
PhoneNumberConfirmed = c.Boolean(nullable: false),
TwoFactorEnabled = c.Boolean(nullable: false),
LockoutEndDateUtc = c.DateTime(),
LockoutEnabled = c.Boolean(nullable: false),
AccessFailedCount = c.Int(nullable: false),
UserName = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.UserName, unique: true, name: "UserNameIndex");
CreateTable(
"dbo.UserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.Int(nullable: false),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.UserLogin",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.Users",
c => new
{
Id = c.Int(nullable: false, identity: true),
Email = c.String(),
EmailConfirmed = c.Boolean(nullable: false),
PasswordHash = c.String(),
SecurityStamp = c.String(),
PhoneNumber = c.String(),
PhoneNumberConfirmed = c.Boolean(nullable: false),
TwoFactorEnabled = c.Boolean(nullable: false),
LockoutEndDateUtc = c.DateTime(),
LockoutEnabled = c.Boolean(nullable: false),
AccessFailedCount = c.Int(nullable: false),
UserName = c.String(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropForeignKey("dbo.UserRole", "UserId", "dbo.Users");
DropForeignKey("dbo.UserLogin", "UserId", "dbo.Users");
DropForeignKey("dbo.UserClaims", "UserId", "dbo.Users");
DropForeignKey("dbo.UserRole", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.UserLogin", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.UserClaims", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.UserRole", "RoleId", "dbo.Role");
DropIndex("dbo.UserLogin", new[] { "UserId" });
DropIndex("dbo.UserClaims", new[] { "UserId" });
DropIndex("dbo.AspNetUsers", "UserNameIndex");
DropIndex("dbo.UserRole", new[] { "RoleId" });
DropIndex("dbo.UserRole", new[] { "UserId" });
DropIndex("dbo.Role", "RoleNameIndex");
DropTable("dbo.Users");
DropTable("dbo.UserLogin");
DropTable("dbo.UserClaims");
DropTable("dbo.AspNetUsers");
DropTable("dbo.UserRole");
DropTable("dbo.Role");
}
}
其他信息: 该应用程序使用“AspNetUsers”表作为主要表。
感谢任何帮助。
答案 0 :(得分:0)
我认为您必须在 OnModelCreating 方法中将IdentityUser映射到新用户表。
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("UserId");