#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. приятно слышать.