我需要在ASP.NET MVC 5中为角色身份表添加一个额外的字段。
我使用迁移。
我添加了角色的扩展名,如:
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name)
: base(name)
{
}
public virtual Project Project { get; set; }
}
我的迁移课程,我得到的是:
public partial class ProjectToIdentity : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Projects",
c => new
{
ID = c.Int(nullable: false, identity: true),
ProjectName = c.String(maxLength: 100),
})
.PrimaryKey(t => t.ID);
AddColumn("dbo.AspNetRoles", "Discriminator", c => c.String(nullable: false, maxLength: 128));
AddColumn("dbo.AspNetRoles", "Project_ID", c => c.Int());
CreateIndex("dbo.AspNetRoles", "Project_ID");
AddForeignKey("dbo.AspNetRoles", "Project_ID", "dbo.Projects", "ID");
}
public override void Down()
{
DropForeignKey("dbo.AspNetRoles", "Project_ID", "dbo.Projects");
DropIndex("dbo.AspNetRoles", new[] { "Project_ID" });
DropColumn("dbo.AspNetRoles", "Project_ID");
DropColumn("dbo.AspNetRoles", "Discriminator");
DropTable("dbo.Projects");
}
}
问题是 - 什么是Discriminator专栏?我的模型中没有这样的专栏。为什么迁移工具会添加此字段以及它具有什么目标?
答案 0 :(得分:25)
嗯,快速回答理解,或者至少使其更清晰。
正如Jasen所说,您可以在http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph或任何其他链接上阅读每个层次结构表(TPH)。但是,说实话,从第一次开始就不那么容易理解。
以下是一个快速回答:
如您所见 - 新记录在“歧视”列中包含“ApplicationRole”。所以说 - 该列包含继承IdentityRole的新类的名称。 因此,可能会有更多的类,它们将继承IdentityRole,但对于每个记录,Identity系统将存储该值 - 使用创建记录的类。
如图所示,ApplicationRole Discriminator仅出现在由类创建的记录中,称为继承IdentityRole的ApplicationRole。