Определение нескольких внешних ключей для одной и той же таблицы в корневом коде Entity First

У меня есть два объекта в моем приложении MVC, и я заполнил базу данных с помощью подхода Entity Framework 6 Code First. В студенческой организации есть два идентификатора города; один из них для BirthCity, другой для WorkCity. Когда я определяю foreign keys, как указано выше, после миграции создается дополнительный столбец с именем City_ID в таблице Student. Id там ошибка или как определить эти FK? Заранее спасибо.

Студент:

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")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] public virtual City LivingCity { get; set; } } 

Город:

 public class City { public int ID { get; set; } public string CityName { get; set; } public virtual ICollection Students { get; set; } } 

Для достижения того, что вы хотите, вам нужно предоставить некоторую дополнительную конфигурацию. Код Первое соглашение может идентифицировать двунаправленные отношения, но не тогда, когда есть несколько двунаправленных отношений между двумя объектами. Вы можете добавить конфигурацию (используя annotations данных или 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 навигации BirthCity со свойством « BirthCity Students в другом конце отношения.

Использование Fluent Api может быть следующим:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasRequired(m => m.BirthCity) .WithMany(m => m.Students).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity().HasRequired(m => m.LivingCity) .WithMany().HasForeignKey(m=>m.LivingCityId); } 

С помощью этого последнего решения вам не нужно использовать какой-либо аттрибут.

Теперь предложение @ChristPratt in имеет коллекцию Student в вашем classе 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().HasRequired(m => m.BirthCity) .WithMany(m => m.BirthCityStudents).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity().HasRequired(m => m.LivingCity) .WithMany(m => m.LivingCityStudents).HasForeignKey(m=>m.LivingCityId); } 

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

Проблема в том, что вы используете единую коллекцию студентов в City . Что на самом деле происходит здесь, так это то, что EF не может решить, какой внешний ключ должен на самом деле отображать эту коллекцию, поэтому он создает другой внешний ключ, специально предназначенный для отслеживания этих отношений. Затем, по сути, у вас нет свойств навигации для коллекций студентов, полученных из BirthCity и LivingCity .

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

 public class City { ... public virtual ICollection BirthCityStudents { get; set; } public virtual ICollection LivingCityStudents { get; set; } } 

Затем для Student :

 public class Student { ... public class StudentMapping : EntityTypeConfiguration { public StudentMapping() { HasRequired(m => m.BirthCity).WithMany(m => m.BirthCityStudents); HasRequired(m => m.LivingCity).WithMany(m => m.LivingCityStudents); } } } 

И, наконец, в вашем контексте:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new Student.StudentMapping()); } 
Interesting Posts

Очистите диск по ошибке с помощью diskpart. Возможно ли восстановить данные, хранящиеся в конкретном разделе?

Удаленный раздел Linux и теперь Grub Rescue Shows Up

Подключение MongoDB к мобильному или браузерному приложению

Как найти размер виртуальной памяти и размер кеша в Linux-системе?

Указатель функций, отлитый от другой подписи

Как добавить поддержку колесика мыши к компоненту, сгенерированному из TGraphicControl?

Настройка уникального ограничения с использованием свободного API?

Неустранимая ошибка: неверный макет java.lang.String по значению

Как получить метки данных для гистограммы в ggplot2?

Java TCP-сокет: передача данных медленная

Ошибка выполнения: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

ОШИБКА: проблемы с рендерингом Не удалось найти следующие classы: android.support.v7.internal.widget.ActionBarOverlayLayout

VPN: Проводят ли все трафик через VPN при входе в систему?

Как возобновить fragment из BackStack, если он существует

Связаны ли статические переменные между streamами?

Давайте будем гением компьютера.