类 继承自 Code First 迁移中未包含的 Identity 对象
Classes inherited from Identity objects not included in Code First Migrations
为了完全自定义 ASP.NET Identity 框架,我从所有六个 Identity classes:
中继承了 classes
public class VigilUserRole : IdentityUserRole<Guid>
public class VigilUserLogin : IdentityUserLogin<Guid>
public class VigilUserClaim : IdentityUserClaim<Guid>
public class VigilUser : IdentityUser<Guid, VigilUserLogin, VigilUserRole, VigilUserClaim>
public class VigilRole : IdentityRole<Guid, VigilUserRole>
public class VigilDataContext : IdentityDbContext<VigilUser, VigilRole, Guid, VigilUserLogin, VigilUserRole, VigilUserClaim>
在项目中没有其他任何东西的情况下,我尝试添加一个初始迁移。所有默认 AspNet*
表是迁移中唯一包含的表。
public override void Up()
{
CreateTable(
"dbo.AspNetRoles",
c => new
{
Id = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"dbo.AspNetUserRoles",
c => new
{
UserId = c.Guid(nullable: false),
RoleId = c.Guid(nullable: false),
VigilUserRoleId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.Guid(nullable: false),
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.AspNetUserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.Guid(nullable: false),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.AspNetUserLogins",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
}
我什至尝试覆盖 OnModelCreating
方法,明确忽略 Identity
表并注册 Vigil
classes.
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Ignore(new Type[] { typeof(IdentityUser), typeof(IdentityRole), typeof(IdentityUserClaim), typeof(IdentityUserRole), typeof(IdentityUserLogin) });
modelBuilder.RegisterEntityType(typeof(VigilUser));
modelBuilder.RegisterEntityType(typeof(VigilUserRole));
modelBuilder.RegisterEntityType(typeof(VigilUserClaim));
modelBuilder.RegisterEntityType(typeof(VigilUserLogin));
modelBuilder.RegisterEntityType(typeof(VigilRole));
base.OnModelCreating(modelBuilder);
}
我错过了什么 Vigil
classes 在迁移中没有被识别,但是 Identity
class(映射到 AspNet
表)被包括在内?我什至尝试用 int
替换 TKey
类型,但收到相同的结果。
也可以从 my sandbox repo 下载解决方案,其中包括解决问题的各种失败尝试的历史记录。
您的 ApplicationDbContext 继承自 IdentityDbContext。
在 ApplicationDbContext 最后一行的 OnModelCreating 方法中 (base.OnModelCreating(modelBuilder))
您调用包含
的基础 class(来源 here)的 OnModelCreating 方法
modelBuilder.Entity<TUser>().ToTable("AspNetUsers");
modelBuilder.Entity<TUserRole>().HasKey(r => new { r.UserId, r.RoleId })
.ToTable("AspNetUserRoles");
modelBuilder.Entity<TUserLogin>()
.HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
.ToTable("AspNetUserLogins");
modelBuilder.Entity<TUserClaim>()
.ToTable("AspNetUserClaims");
modelBuilder.Entity<TRole>()
.ToTable("AspNetRoles");
所以无论你在上面做了什么,你都会覆盖它。
尝试将此行移到自定义代码之前。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<VigilUser>().ToTable("VigilUser");
modelBuilder.Entity<VigilRole>().ToTable("VigilRole");
modelBuilder.Entity<VigilUserRole>().ToTable("VigilUserRole");
modelBuilder.Entity<VigilUserClaim>().ToTable("VigilUserClaim");
modelBuilder.Entity<VigilUserLogin>().ToTable("VigilUserLogin");
}
为了完全自定义 ASP.NET Identity 框架,我从所有六个 Identity classes:
中继承了 classespublic class VigilUserRole : IdentityUserRole<Guid>
public class VigilUserLogin : IdentityUserLogin<Guid>
public class VigilUserClaim : IdentityUserClaim<Guid>
public class VigilUser : IdentityUser<Guid, VigilUserLogin, VigilUserRole, VigilUserClaim>
public class VigilRole : IdentityRole<Guid, VigilUserRole>
public class VigilDataContext : IdentityDbContext<VigilUser, VigilRole, Guid, VigilUserLogin, VigilUserRole, VigilUserClaim>
在项目中没有其他任何东西的情况下,我尝试添加一个初始迁移。所有默认 AspNet*
表是迁移中唯一包含的表。
public override void Up()
{
CreateTable(
"dbo.AspNetRoles",
c => new
{
Id = c.Guid(nullable: false),
Name = c.String(nullable: false, maxLength: 256),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, unique: true, name: "RoleNameIndex");
CreateTable(
"dbo.AspNetUserRoles",
c => new
{
UserId = c.Guid(nullable: false),
RoleId = c.Guid(nullable: false),
VigilUserRoleId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.UserId, t.RoleId })
.ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId)
.Index(t => t.RoleId);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.Guid(nullable: false),
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.AspNetUserClaims",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.Guid(nullable: false),
ClaimType = c.String(),
ClaimValue = c.String(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
CreateTable(
"dbo.AspNetUserLogins",
c => new
{
LoginProvider = c.String(nullable: false, maxLength: 128),
ProviderKey = c.String(nullable: false, maxLength: 128),
UserId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
}
我什至尝试覆盖 OnModelCreating
方法,明确忽略 Identity
表并注册 Vigil
classes.
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Ignore(new Type[] { typeof(IdentityUser), typeof(IdentityRole), typeof(IdentityUserClaim), typeof(IdentityUserRole), typeof(IdentityUserLogin) });
modelBuilder.RegisterEntityType(typeof(VigilUser));
modelBuilder.RegisterEntityType(typeof(VigilUserRole));
modelBuilder.RegisterEntityType(typeof(VigilUserClaim));
modelBuilder.RegisterEntityType(typeof(VigilUserLogin));
modelBuilder.RegisterEntityType(typeof(VigilRole));
base.OnModelCreating(modelBuilder);
}
我错过了什么 Vigil
classes 在迁移中没有被识别,但是 Identity
class(映射到 AspNet
表)被包括在内?我什至尝试用 int
替换 TKey
类型,但收到相同的结果。
也可以从 my sandbox repo 下载解决方案,其中包括解决问题的各种失败尝试的历史记录。
您的 ApplicationDbContext 继承自 IdentityDbContext。 在 ApplicationDbContext 最后一行的 OnModelCreating 方法中 (base.OnModelCreating(modelBuilder)) 您调用包含
的基础 class(来源 here)的 OnModelCreating 方法modelBuilder.Entity<TUser>().ToTable("AspNetUsers");
modelBuilder.Entity<TUserRole>().HasKey(r => new { r.UserId, r.RoleId })
.ToTable("AspNetUserRoles");
modelBuilder.Entity<TUserLogin>()
.HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
.ToTable("AspNetUserLogins");
modelBuilder.Entity<TUserClaim>()
.ToTable("AspNetUserClaims");
modelBuilder.Entity<TRole>()
.ToTable("AspNetRoles");
所以无论你在上面做了什么,你都会覆盖它。
尝试将此行移到自定义代码之前。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<VigilUser>().ToTable("VigilUser");
modelBuilder.Entity<VigilRole>().ToTable("VigilRole");
modelBuilder.Entity<VigilUserRole>().ToTable("VigilUserRole");
modelBuilder.Entity<VigilUserClaim>().ToTable("VigilUserClaim");
modelBuilder.Entity<VigilUserLogin>().ToTable("VigilUserLogin");
}