12

Potrzebowałem dodać dodatkowe pole do tabeli tożsamości ról w ASP.NET MVC 5.Co to jest kolumna Discriminator w migracji ASP.NET?

Używam migracji.

Dodałem rozszerzenie do roli takich jak:

public class ApplicationRole : IdentityRole 
{ 
    public ApplicationRole() : base() { } 

    public ApplicationRole(string name) 
     : base(name) 
    { 
    } 

    public virtual Project Project { get; set; } 
} 

moja klasa migracji, dostaję to:

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

Pytanie brzmi - co to jest kolumna Discriminator? Nie mam takiej kolumny w moim modelu. Dlaczego narzędzie migracji dodaje to pole i jaki ma cel?

+0

Służy do schematu dziedziczenia tabeli. Oto dobry opis http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph. – Jasen

+0

Czy ktoś był w stanie pozbyć się kolumny "Dyskryminatora" w tym scenariuszu? Rozumiem, dlaczego EF dodaje to, ale w moim przypadku chcę tylko utrzymać "ApplicationRole" - nie będzie "IdentityRole". Uczyniłbym to "abstrakcyjnym", gdybym mógł, ale jest w pakiecie nuget, więc nie wchodzi to w grę. –

Odpowiedz

18

Cóż, szybka odpowiedź, aby zrozumieć lub przynajmniej wyjaśnić.

Jak powiedział Jasen, można przeczytać o Tabela na Hierarchię (TPH) pod http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph lub dowolne inne linki. Ale, prawdę mówiąc, nie jest to łatwe do zrozumienia po raz pierwszy.

Oto szybki odpowiedź:

  1. spróbować stworzyć nową rolę, wykorzystując ApplicationRole (klasy, który został opublikowany w pytaniu), odziedziczone IdentityRole
  2. Po utworzeniu nowej roli , spójrz na pola Dyskryminacji.

Jak widać - nowy rekord zawiera "ApplicationRole" w kolumnie Dyskryminacja. Można powiedzieć - ta kolumna zawiera nazwę nowej klasy, która dziedziczy IdentityRole. Prawdopodobnie istnieje więcej klas, które będą dziedziczyć IdentityRole, ale dla każdego rekordu system tożsamości będzie przechowywać wartość - przy użyciu której klasy rekord został utworzony.

enter image description here

Jak widać, ApplicationRole Discriminator pojawiła się tylko na płycie, stworzonego przez klasę o nazwie ApplicationRole która dziedziczy IdentityRole.

+0

Nie wiedziałem, że EF/ASP.NET planuje mieć pojedynczą tabelę dla wielu projektów, dopóki nie przeczytam twojej odpowiedzi. Czy to także dlatego, że ustawienie mojej dodatkowej kolumny nie jest zerowalne, mimo że mam ustawiony atrybut [Wymagany]? A czy nie powinienem ręcznie ustawiać tego tak, aby nie podlegał zerowaniu w mojej migracji? –