Как соединить эти две сущности

#entity-framework #entity-framework-core

#entity-framework #entity-framework-core

Вопрос:

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

Сценарий: у меня есть регистрация и профессора. Каждой регистрации назначено ровно два профессора. Но профессорам можно назначить несколько регистраций.

Мои модели:

 public class ThesisRegistration : Entity
{
    ...
    [Required] public long FirstExaminerId { get; set; }
    public Professor FirstExaminer { get; set; }
        
    [Required] public long SecondExaminerId { get; set; }
    public Professor SecondExaminer { get; set; }

    public List<ProfessorThesisRegistration> ProfessorThesisRegistrations { get; set; }
}

public class Professor : Entity
{
    ...
    public List<ProfessorThesisRegistration> ProfessorThesisRegistrations { get; set; }
}

public class ProfessorThesisRegistration
{
    public int ProfessorId { get; set; }
    public Professor Professor { get; set; }

    public int ThesisRegistrationId { get; set; }
    public ThesisRegistration ThesisRegistration { get; set; }
}
  

Затем конфигурация:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...
    modelBuilder.Entity<ProfessorThesisRegistration>().HasKey(i => new {i.ProfessorId, i.ThesisRegistrationId});
    modelBuilder.Entity<ProfessorThesisRegistration>()
        .HasOne(pt => pt.Professor)
        .WithMany(f => f.ProfessorThesisRegistrations)
        .HasForeignKey(pt => pt.ProfessorId);
    modelBuilder.Entity<ProfessorThesisRegistration>()
        .HasOne(pt => pt.ThesisRegistration)
        .WithMany(t => t.ProfessorThesisRegistrations)
        .HasForeignKey(pt => pt.ThesisRegistrationId);
}
  

Что мне нужно изменить, чтобы эта связь работала? Спасибо!

Ответ №1:

Если я хочу перейти прямо к делу, я должен сказать, что вы совершенно не правы в проектировании своей базы данных, потому что в том сценарии, который вы определяете, отношение между Registrations и Professors не является отношением «Многие ко многим», скорее это отношение «один ко многим».

P.S: Для того, чтобы быть осязаемым, я добавляю некоторые свойства в вашу модель.

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

 public class ThesisRegistration
{
    public int Id { get; set; }
    public string Title { get; set; }

    public int FirstExaminerId { get; set; }
    public virtual Professor FirstExaminer { get; set; }

    public int SecondExaminerId { get; set; }
    public virtual Professor SecondExaminer { get; set; }
}
  

и измените модель профессора, как показано ниже:

     public class Professor
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<ThesisRegistration> ThesisRegistrationsOfFirstExaminer { get; set; }
        public virtual ICollection<ThesisRegistration> ThesisRegistrationsOfSecondExaminer { get; set; }
    }
  

и в методе OnModelCreating:

         modelBuilder.Entity<ThesisRegistration>()
            .HasOne(p => p.FirstExaminer)
            .WithMany(p => p.ThesisRegistrationsOfFirstExaminer)
            .HasForeignKey(p => p.FirstExaminerId)
            .OnDelete(DeleteBehavior.NoAction);

        modelBuilder.Entity<ThesisRegistration>()
            .HasOne(p => p.SecondExaminer)
            .WithMany(p => p.ThesisRegistrationsOfSecondExaminer)
            .HasForeignKey(p => p.SecondExaminerId)
            .OnDelete(DeleteBehavior.NoAction);   
  

теперь при таком дизайне у каждой диссертации может быть ровно два экзаменатора, и у каждого профессора может быть несколько диссертаций.
не стесняйтесь задавать вопросы. удачи.

Комментарии:

1. приятно слышать.