ASP.NET 迁移中的鉴别器列是什么?
What is a Discriminator column in ASP.NET Migrations?
我需要在 ASP.NET MVC 5 中向角色标识 table 添加一个额外的字段。
我使用迁移。
我已经为角色添加了扩展,例如:
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name)
: base(name)
{
}
public virtual Project Project { get; set; }
}
我的迁移 class,我得到的是:
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");
}
}
问题是 - 什么是鉴别器列?我的模型中没有这样的列。迁移工具为什么要增加这个字段,它的目的是什么?
好吧,一个快速的回答让你明白,或者,至少,让它更清楚。
正如 Jasen 所说,您可以在 http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph 或任何其他链接中阅读有关每个层次结构 (TPH) 的 Table。但是,说实话,第一次看的时候不是那么容易理解的。
这是一个快速回答:
- 尝试使用继承自 IdentityRole
的 ApplicationRole(有问题的 class)创建一个新角色
- 创建新角色后,查看“歧视”字段。
如您所见 - 新记录的“区分”列中包含 "ApplicationRole"。也就是说 - 该列包含继承 IdentityRole 的新 class 的名称。
因此,可能会有更多 classes,它们将继承 IdentityRole,但对于每条记录,Identity 系统将存储值 - class 记录是使用它创建的。
如图所示,ApplicationRole Discriminator仅针对记录出现,由class创建,称为继承IdentityRole的ApplicationRole。
我需要在 ASP.NET MVC 5 中向角色标识 table 添加一个额外的字段。
我使用迁移。
我已经为角色添加了扩展,例如:
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name)
: base(name)
{
}
public virtual Project Project { get; set; }
}
我的迁移 class,我得到的是:
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");
}
}
问题是 - 什么是鉴别器列?我的模型中没有这样的列。迁移工具为什么要增加这个字段,它的目的是什么?
好吧,一个快速的回答让你明白,或者,至少,让它更清楚。
正如 Jasen 所说,您可以在 http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph 或任何其他链接中阅读有关每个层次结构 (TPH) 的 Table。但是,说实话,第一次看的时候不是那么容易理解的。
这是一个快速回答:
- 尝试使用继承自 IdentityRole 的 ApplicationRole(有问题的 class)创建一个新角色
- 创建新角色后,查看“歧视”字段。
如您所见 - 新记录的“区分”列中包含 "ApplicationRole"。也就是说 - 该列包含继承 IdentityRole 的新 class 的名称。 因此,可能会有更多 classes,它们将继承 IdentityRole,但对于每条记录,Identity 系统将存储值 - class 记录是使用它创建的。
如图所示,ApplicationRole Discriminator仅针对记录出现,由class创建,称为继承IdentityRole的ApplicationRole。