Code First TPT Моделирование, где элемент может быть нескольких производных типов - PullRequest
1 голос
/ 28 февраля 2012

Как лучше всего смоделировать следующий тип отношений в Code First?

абстрактный человек

студент: человек

учитель: человек

Исследователь: Персона

... еще много ...

Где человек один ИЛИ БОЛЬШЕ производных типов.

Мне нравится идеяTPT, но не уверен, что это уместно, когда отношения таковы, что человек может быть студентом и исследователем.

1 Ответ

4 голосов
/ 28 февраля 2012

Вы можете использовать композицию для моделирования сценария. Это можно настроить с помощью сопоставления общего первичного ключа, когда все классы соответствуют уникальным таблицам.

public class Person
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public abstract class Role
{
    public int PersonId { get; set; }

    public virtual Person Person { get; set; }
}

public class Student : Role
{

}

public class Teacher : Role
{

}

public class RoleContext : DbContext
{
    public DbSet<Student> Students { get; set; }

    public DbSet<Teacher> Teachers { get; set; }

    public DbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>().ToTable("Student");
        modelBuilder.Entity<Student>().HasKey(s => s.PersonId);
        modelBuilder.Entity<Student>().HasRequired(s => s.Person).WithOptional();

        modelBuilder.Entity<Teacher>().ToTable("Teacher");
        modelBuilder.Entity<Teacher>().HasKey(t => t.PersonId);
        modelBuilder.Entity<Teacher>().HasRequired(t => t.Person).WithOptional();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...