12

我需要在ASP.NET MVC 5的角色标识表中添加一个额外的字段。什么是ASP.NET迁移中的Discriminator列?

我使用迁移。

我添加的扩展,对于喜欢角色:

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"); 
    } 
} 

的问题是 - 什么是鉴别列?我的模型中没有这样的列。为什么迁移工具增加了这个领域,它有什么目标?

+0

它用于表继承计划。这里有一个很好的描述http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph。 – Jasen 2015-01-20 20:15:35

+0

有没有人能够摆脱这种情况下的'Discriminator'列?我明白为什么EF添加它,但在我的情况下,我只想坚持'ApplicationRole' - 不会有'IdentityRole's。如果可以的话,我会把它做成“抽象的”,但它在nuget包中,所以这是不可能的。 – 2016-02-05 16:49:43

回答

18

好吧,快速回答要理解,或者至少让它更清楚。

正如Jasen告诉你的,你可以阅读表每个等级(TPH)http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph或任何其他链接。但是,说实话,从第一次开始就不容易理解。

下面是一个简单的回答:

  1. 尝试创建一个新的角色,使用ApplicationRole(类,被张贴在的问题),您创建一个新的角色后从IdentityRole
  2. 继承,看看歧视领域。

正如您将看到的那样 - 新记录包含Discrimination列中的“ApplicationRole”。所以说 - 该列包含继承IdentityRole的新类的名称。 因此,可能会有更多的类,它们将继承IdentityRole,但是对于每个记录,Identity系统将存储该值 - 使用哪个类创建记录。

enter image description here

如图所示,ApplicationRole鉴别只出现了继承IdentityRole备案,由类创建的,称为ApplicationRole。

+0

我没有意识到EF/ASP.NET会计划在多个项目中使用单个表格,直到我阅读您的答案。这也是为什么它没有设置我的附加列不能为空,即使我有[必须]属性集?我应该不是手动设置这个在我的迁移中不可空? – 2015-07-29 00:54:42

相关问题