Что такое столбец дискриминации в ASP.NET Migrations?

Мне нужно было добавить дополнительное поле в таблицу идентификации ролей в 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");
    }
}

Вопрос в том, что такое столбец дискриминатора? У меня нет такой колонки в моей модели. Почему средство миграции добавляет это поле и какую цель оно имеет?

Ответ 1

Ну, быстрый ответ, чтобы понять или, по крайней мере, сделать его более понятным.

Как рассказал Jasen, вы можете прочитать таблицу на иерархию (TPH) http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph или любые другие ссылки. Но, честно говоря, это не так просто понять с первого раза.

Вот быстрый ответ:

  • Попробуйте создать новую роль, используя ApplicationRole (класс, который был опубликован под вопросом), унаследованный от IdentityRole
  • После создания новой роли просмотрите поля дискриминации.

Как вы увидите - новая запись содержит "ApplicationRole" в столбце "Discrimination". Так сказать - этот столбец содержит имя нового класса, который наследует IdentityRole. Таким образом, вероятно, может быть больше классов, которые будут наследовать IdentityRole, но для каждой записи система Identity сохранит это значение - используя класс, в котором была создана запись.

enter image description here

Как показано, ApplicationRole Discriminator появился только для записи, созданной классом, называемой ApplicationRole, которая наследует IdentityRole.