Определение нескольких внешних ключей для одной и той же таблицы в корневом коде 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()); } 
  • MySQL DROP все таблицы, игнорируя foreign keys
  • Django: установить внешний ключ с помощью целого числа?
  • Действительно ли необходимы foreign keys в дизайне базы данных?
  • Код ошибки: 1005. Невозможно создать таблицу «...» (errno: 150)
  • Ограничения внешнего ключа в Android с помощью SQLite? on Удалить каскад
  • Force InnoDB перепроверять foreign keys на столе / таблицах?
  • объект объекта не может ссылаться на несколько экземпляров IEntityChangeTracker. при добавлении связанных объектов к объекту в Entity Framework 4.1
  • Как изменить ссылочное действие внешнего ключа? (поведение)
  • MySql Ошибка 150 - Внешние ключи
  • Interesting Posts

    Полный рабочий пример сценария анимации с тремя fragmentами Gmail?

    Отсроченное исполнение и нетерпеливая оценка

    Добавление незначительных меток на ось x в ggplot2 (без меток)

    Печать int в двоичном представлении с использованием C

    Как найти, какие обещания необработаны в Node.js UnhandledPromiseRejectionWarning?

    Возможно ли предотвратить включение каталога в Windows?

    Итерация с циклом цикла или while?

    Не удается установить windows 7 или ubuntu

    Цифровой знак электронной почты Gmail с S / MIME

    Могу ли я потерять три IP-адреса в каждой сети при подключенной сетевой сети Xen?

    Могу ли я безопасно игнорировать предупреждение тестирования логотипа Windows при установке VirtualBox в Windows XP?

    Установите новую вкладку в Firefox.

    VBA для копирования файла из одного каталога в другой

    Обновление Windows не запускает Vista SP2

    Как устранить асимметричную скорость PPTP VPN? (Нисходящая линия к клиенту медленная, пропускная способность сервера и отсутствие накладных расходов на шифрование)

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