Entity Framework 6 и Связанные отношения - PullRequest
0 голосов
/ 29 июня 2018

Возникли некоторые проблемы со связями в 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, а не ученика.

Буду признателен за любые советы и рекомендации!

Заранее спасибо!

(обновлен другой пример, чтобы иметь больше смысла)

...