12

Мне нужно было добавить дополнительное поле в таблицу идентификации ролей в ASP.NET MVC 5.Что такое столбец дискриминатора в ASP.NET Migrations?

Я использую миграции.

я добавил расширение к роли, как:

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

+0

Может ли кто-нибудь избавиться от столбца «Дискриминатор» в этом сценарии? Я понимаю, почему EF добавляет его, но в моем случае я хочу только сохранить «ApplicationRole» - не будет 'IdentityRole'. Я бы сделал его «абстрактным», если бы мог, но он находится в пакете nuget, так что этого не может быть и речи. –

ответ

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. После того, как вы создали новую роль , взгляните на поля дискриминации.

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

enter image description here

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

+0

Я не понимал, что EF/ASP.NET собирается планировать наличие отдельной таблицы для нескольких проектов, пока я не прочитаю ваш ответ. Неужели это также не значит, что мой дополнительный столбец не может быть нулевым, даже если у меня установлен атрибут [Обязательный]? И не следует ли мне вручную установить это, чтобы оно не было равно нулю в моей миграции? –

Смежные вопросы