Ответ 1
Чтобы достичь того, что вы хотите, вам нужно предоставить некоторую дополнительную конфигурацию. Код Первое соглашение может идентифицировать двунаправленные отношения, но не тогда, когда есть
несколько двунаправленных отношений между двумя объектами. Вы можете добавить конфигурацию (используя Аннотации данных или Fluent API), чтобы представить это
информацию строителю модели. С аннотациями данных вы будете использовать аннотацию
называемый InverseProperty
. С Fluent API вы будете использовать комбинацию методов Has
/With
, чтобы указать правильные концы этих отношений.
Использование Аннотации данных может быть таким:
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int BirthCityID { get; set; }
public int LivingCityID { get; set; }
[ForeignKey("BirthCityID")]
[InverseProperty("Students")]
public virtual City BirthCity { get; set; }
[ForeignKey("LivingCityID")]
public virtual City LivingCity { get; set; }
}
Таким образом вы явно указываете, что хотите связать свойство навигации BirthCity
с атрибутом навигации Students
в другом конце отношения.
Использование Fluent Api может быть таким:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity)
.WithMany(m => m.Students).HasForeignKey(m=>m.BirthCityId);
modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity)
.WithMany().HasForeignKey(m=>m.LivingCityId);
}
С помощью этого последнего решения вам не нужно использовать какой-либо аттрибут.
Теперь предложение @ChristPratt in имеет набор Student
в вашем классе City
для каждой взаимосвязи. Если вы это сделаете, то конфигурации с использованием Аннотации данных могут быть следующими:
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int BirthCityID { get; set; }
public int LivingCityID { get; set; }
[ForeignKey("BirthCityID")]
[InverseProperty("BirthCityStudents")]
public virtual City BirthCity { get; set; }
[ForeignKey("LivingCityID")]
[InverseProperty("LivingCityStudents")]
public virtual City LivingCity { get; set; }
}
Или используя Fluent Api, следуя той же идее:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity)
.WithMany(m => m.BirthCityStudents).HasForeignKey(m=>m.BirthCityId);
modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity)
.WithMany(m => m.LivingCityStudents).HasForeignKey(m=>m.LivingCityId);
}