Asp.net

什麼是 ASP.NET 遷移中的鑑別器列?

  • January 20, 2015

我需要在 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");
   }
}

問題是 - 什麼是鑑別器列?我的模型中沒有這樣的列。為什麼遷移工具會添加這個欄位,它的目的是什麼?

好吧,一個快速的答案可以理解,或者至少讓它更清楚。

正如 Jasen 所說,您可以在http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table閱讀有關按層次結構表 (TPH)的資訊-per-hierarchy-tph或任何其他連結。但是,說實話,從一開始就不是那麼容易理解的。

這是一個快速的答案:

  1. 嘗試使用繼承自 IdentityRole 的ApplicationRole(已發布的類)創建一個新角色
  2. 創建新角色後,請查看歧視欄位。

如您所見 - 新記錄在 Discrimination 列中包含“ApplicationRole”。可以這麼說 - 該列包含繼承 IdentityRole 的新類的名稱。因此,可能會有更多類繼承 IdentityRole,但對於每條記錄,身份系統將儲存值 - 使用創建記錄的類。

在此處輸入圖像描述

如圖所示,ApplicationRole Discriminator 僅針對由繼承 IdentityRole 的名為 ApplicationRole 的類創建的記錄出現。

引用自:https://stackoverflow.com/questions/28054254