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

相關問題