Entity Framework — столбец дискриминатора создается с помощью TPT

Итак, я пытаюсь сначала реализовать Table-per-Type, используя код Entity Framework, однако столбец дискриминатора все еще создается в таблице AspNetUsers (класс ApplicationUser), хотя я сказал это иначе.

Дбконтекст

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolContext, School.Migrations.Configuration>());

        modelBuilder.Entity<Student>().ToTable("Students");
        modelBuilder.Entity<Teacher>().ToTable("Teachers");
    }  

    public virtual DbSet<Address> Addresses { get; set; }

POCO рассматриваемых классов, включая ApplicationUser, который использует ASP Identity:

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<Address> Addresses { get; set; }
}

public class Student: ApplicationUser
{
    public virtual string Name { get; set; }
    public virtual ICollection<Subject> Subjects{ get; set; }
}

public class Teacher: ApplicationUser
{
    public virtual int Wage{ get; set; }
}

Полученная схема базы данных, кажется, вставляет столбец «Дискриминатор», хотя, когда я регистрирую новую учетную запись через веб-сайт, столбец все равно показывает «неопределенный» для строки.

Вещи, которые я пробовал: добавление в OnModelCreating для ApplicationUser, создаваемого с помощью ToTable ("AspNetUsers") и т. д.

Любая помощь будет потрясающей!


person Community    schedule 09.04.2015    source источник
comment
вы пытались полностью удалить базу данных, а затем снова создать ее с помощью миграции?   -  person renakre    schedule 09.04.2015
comment
Ваша установка подходит для TPT. Возможно, столбец «Дискриминатор» остался от предыдущей сборки, так как EF по умолчанию использует TPH. например, если вы создали приложение до того, как вставили modelBuilder.Entity<Student>().ToTable("Students");   -  person SWilko    schedule 09.04.2015
comment
Да, я удалил базу данных и все миграции, добавил еще одну миграцию с изменениями TPT, но столбец все еще там.   -  person    schedule 09.04.2015


Ответы (1)


Я столкнулся с той же проблемой. Оказывается, у вас должно быть свободное сопоставление таблиц API для всех классов в иерархии. Поскольку у вас нет сопоставления для ApplicationUser и IdentityUser, EF считает, что вы собираетесь использовать стратегию Type Per Concrete. Я рекомендую, чтобы ApplicationUser инкапсулировал IdentityUser, если вы не хотите определять таблицу для IdentityUser, а также определять сопоставление таблиц для ApplicationUser.

Быстрым тестом было бы добавить сопоставление ApplicationUser с AspNetUsers и удалить наследование от IdentityUser и посмотреть, поможет ли это.

Надеюсь, это поможет.

Спасибо, Эйб Билла.

person Abdallah Mancour Billah    schedule 02.09.2015