Возникли некоторые проблемы со связями в EntityFramework 6.
Я знаю, что можно использовать DataAnnotations или FluentApi, и я согласен с использованием любого из них.
Вот пример отношений, которые я хотел бы установить:
- Студент имеет одну запись иммунизации
- Запись иммунизации имеет несколько записей ShotRecords
Похоже, это будет довольно просто, однако, похоже, что он не работает должным образом.
Вот пример кода (Обновлено с фактическим кодом)
public class Student : Entity
{
[Key]
public int Id { get; set; }
public String Name { get; set; }
//...
[ForeignKey(nameof(Id))]
public virtual ImmunizationRecord ImmunizationRecord { get; set; }
}
public class ImmunizationRecord : Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Key]
[ForeignKey(nameof(Student))]
public int StudentId { get; set; }
public String Name { get; set; }
public DateTime LastUpdated { get; set; }
public virtual Student Student { get; set; }
public virtual ICollection<ShotRecord> ShotRecords { get; set; }
}
public class ShotRecord: Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
// Want this to point back to ImmunizationRecord
public int ImmunizationRecordId { get; set; }
public String Name { get; set; }
public String Description { get; set; }
public DateTime DateOfShot { get; set; }
//...
[ForeignKey("ImmunizationRecordId")]
public virtual ImmunizationRecord ImmunizationRecord { get; set; }
}
Пример fluentapi может выглядеть примерно так:
modelBuilder.Entity<Student>().HasOptional(c => c.ImmunizationRecord).WithRequired(m => m.Student);
modelBuilder.Entity<Student>().HasOptional(c => c.ImmunizationRecord).WithRequired(sc => sc.Student);
modelBuilder.Entity<ImmunizationRecord>().HasMany(sc => sc.ShotRecords).WithRequired(sr => sr.ImmunizationRecord);
Результат
Я подозреваю, что мне просто не хватает небольшого фрагмента того, что нужно сделать, или отсутствует правильный способ настроить эти сущности на аналогичные отношения.
Используя приведенный выше код и структуру класса, я могу без проблем создать Student, а также создать ImmunizationRecord и ShotRecords.
Проблема возникает, когда я пытаюсь извлечь ShotRecords из ImmunizationRecord, EntityFramework разрешит ключ на Student.Id вместо использования ключа на ImmunizationRecord.Id.
Я могу зайти в базу данных и изменить строки для ShotRecords и обновить ImmunizationRecordId до StudentId, и они будут разрешены правильно. Но, как было сказано ранее, я хочу, чтобы они использовали ключ ImmunizationRecord, а не ученика.
Буду признателен за любые советы и рекомендации!
Заранее спасибо!
(обновлен другой пример, чтобы иметь больше смысла)