Иностранные ключи для унаследованного класса для C# NetCore EF - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующие классы

public class Person {
 public int Id {get; set;}
 public string Name {get; Set;}
}
public class Employee : Person {
 public DateTime StartDate {get; set;}
 public int? SkillId {get; Set;}
}
public class Skill {
  public int Id { get; set;}
  public string Description { get; set;}
}


public class HRContext : DbContext
{
    public HRContext()
         : base()
    {
    }
    public virtual DbSet<Person> Persons
    {
        get; set;
    }
    public virtual DbSet<Employee> Employees
    {
        get; set;
    }
    public virtual DbSet<Skill> Skills
    {
        get; set;
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>(entity =>
        {
            entity.HasKey(e => new
            {
                e.Id,
            })
            .HasName("PK_Person");

            entity.Property(e => e.Id)
                            .HasColumnName("ID")
                            .ValueGeneratedOnAdd();

            entity.Property(e => e.Name)
                            .IsRequired()
                            .HasMaxLength(255);
         }
        modelBuilder.Entity<Skill>(entity =>
        {
            entity.HasKey(e => new
            {
                e.Id,
            })
            .HasName("PK_Skill");

            entity.Property(e => e.Id)
                            .HasColumnName("ID")
                            .ValueGeneratedOnAdd();

            entity.Property(e => e.Description)
                            .IsRequired()
                            .HasMaxLength(255);
         }
     }

Таблица Person будет создана с помощью «Discriminator»: «Person» или «Employee». В случае, если после удаления записи в таблице «Умения» мы не хотим, чтобы в объекте сотрудника была мертвая ссылка. Как добавить внешний ключ "SkillId" в таблицу Person?

1 Ответ

1 голос
/ 03 апреля 2020

Добавьте свойство Навигация в Employee for Skill,

public class Employee : Person
{
    public DateTime StartDate { get; set; }
    public int? SkillId { get; set; }
    public Skill Skill { get; set; }
}

и настройте каскадный вид поведения следующим образом:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>()
                    .HasOne(nameof(Employee.Skill))
                    .WithMany()
                    .OnDelete(DeleteBehavior.SetNull);
    }
...