Соединение «многие ко многим» для трех моделей - PullRequest
0 голосов
/ 08 октября 2019

У меня есть три модели: школа, учитель и ученик

public class Pupil
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string FavouriteLesson { get; set; }

    public SchoolEntity School { get; set; }
    public List<Teacher> Teachers { get; set; }

    public IList<DataLink> DataLink { get; set; }
}

public class SchoolEntity
{
    [Key]
    public int Id { get; set; }
    public bool DeepEnglishLearning { get; set; }
    public int? SchoolRating { get; set; }

    public List<Teacher> Teachers { get; set; }
    public List<Pupil> Pupils { get; set; }

    public IList<DataLink> DataLink { get; set; }
}

public class Teacher
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Subject { get; set; }

    public SchoolEntity School { get; set; }
    public List<Pupil> Pupils { get; set; }

    public IList<DataLink> DataLink { get; set; }
}

И у меня есть класс DataLinks для установления соединений:

  • в школе может быть много учеников и учителей
  • ученики могут иметь одну школу и много учителей
  • учителя могут иметь одну школу и много учеников

DataLink.cs

public class DataLink
{
   public int TeacherId { get; set; }
   public Teacher Teacher { get; set; }

   public int PupilId { get; set; }
   public Pupil Pupil { get; set; }
}

Как мне настроить OnModelCreating метод, чтобы он работал?

DatabaseContext

public class DatabaseContext : DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options)
        : base(options)
    {}

    public DbSet<SchoolEntity> SchoolTable { get; set; }
    public DbSet<Teacher> TeacherTable { get; set; }
    public DbSet<Pupil> PupilTable { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SchoolEntity>().ToTable("School");
        modelBuilder.Entity<Teacher>().ToTable("Teacher");
        modelBuilder.Entity<Pupil>().ToTable("Pupil");

        // Is it correct?
        modelBuilder.Entity<DataLink>()
            .HasOne(dl => dl.Teacher)
            .WithMany(dl => dl.DataLink)
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade);

        modelBuilder.Entity<DataLink>()
            .HasOne(dl => dl.Pupil)
            .WithMany(dl => dl.DataLink)
            .IsRequired()
            .OnDelete(DeleteBehavior.Restrict);
    }
}

1 Ответ

2 голосов
/ 09 октября 2019

Если у вас нет дополнительных свойств для связи между учениками и учителями, вам вообще не нужен ваш класс DataLink. EF может сделать таблицу соединения, которая невидима для первой модели кода, чтобы справиться с этим. Как только вы захотите получить дополнительное свойство, оно выйдет в окно, поэтому выбирайте мудро. Вы можете использовать следующее ...

    public class Pupil
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string FavouriteLesson { get; set; }

        public SchoolEntity School { get; set; }
        public List<Teacher> Teachers { get; set; }
    }

    public class SchoolEntity
    {
        [Key]
        public int Id { get; set; }
        public bool DeepEnglishLearning { get; set; }
        public int? SchoolRating { get; set; }

        public List<Teacher> Teachers { get; set; }
        public List<Pupil> Pupils { get; set; }
    }

    public class Teacher
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Subject { get; set; }

        public SchoolEntity School { get; set; }
        public List<Pupil> Pupils { get; set; }
    }

    public class DatabaseContext : DbContext
    {
        public DatabaseContext(DbContextOptions<DatabaseContext> options)
            : base(options)
        {}

        public DbSet<SchoolEntity> SchoolTable { get; set; }
        public DbSet<Teacher> TeacherTable { get; set; }
        public DbSet<Pupil> PupilTable { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<SchoolEntity>().ToTable("School");
            modelBuilder.Entity<Teacher>().ToTable("Teacher");
            modelBuilder.Entity<Pupil>().ToTable("Pupil");

            modelBuilder.Entity<Teacher>().HasRequired(r => r.School).WithMany(m => m.Teachers).HasForiegnKey(k => k.Id);
            modelBuilder.Entity<Pupil>().HasRequired(r => r.School).WithMany(m => m.Pupils).HasForiegnKey(k => k.Id);
            //This will configure many-to-many with a join table. Use .Map to set the table name and key properties manually but EF will auto-name them if you dont
            modelBuilder.Entity<Teacher>().HasMany(x => x.Pupils).WithMany(x => x.Teachers); 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...