К достигните того, что вы хотите, чтобы обеспечить некоторую дополнительную конфигурацию. Код Первое соглашение может идентифицировать двунаправленные отношения, но не тогда, когда есть multi двунаправленные отношения между двумя объектами. Вы можете добавить конфигурацию (используя Аннотации данных или 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 Апи может выглядеть так:
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 в коллекции 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 Апи следуя той же идее:
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);
}
Я упростил свой код для ясности, но мой код точно похож на эту логику. С другой стороны, я уже пытался восстановить базу данных с нуля 2-3 раза, но теперь я делаю то же самое и сообщаю вам через несколько минут. –
@ChrisPratt: Вот шаги, которые я выполнил сейчас: 1) Удаленная папка миграции и ее содержимое из моего проекта. 2) Очистите и перестройте весь проект в решении. 3) включить-миграции в консоли диспетчера пакетов, а затем добавить AutomaticMigrationsEnabled = true; и AutomaticMigrationDataLossAllowed = true; для конструктора конфигурационного файла. 4) Add-Migration. >>> –
@ChrisPratt: Но после этого шага я снова заметил, что в методе Up есть свойство «City_ID = c.Int()». Тем не менее, я искал в решении, и нет свойства «City_ID». Итак, почему эта неопределенная поддержка была добавлена в проект? Заранее спасибо. –