实体框架6和链式关系

时间:2018-06-29 20:04:14

标签: entity-framework-6 foreign-keys

EntityFramework 6中的关系存在一些问题。

我知道可以使用DataAnnotations或FluentApi,但我都可以使用。

这是我要完成的关系的一个例子:

  • 学生有一份免疫记录
  • ImmunizationRecord具有多个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。

当我尝试从ImmunizationRecord检索ShotRecords时,会发生问题,EntityFramework将解决Student.Id上的键,而不是使用ImmunizationRecord.Id上的键。

我可以进入数据库并更改ShotRecords的行,并将ImmunizationRecordId更新为StudentId,它们将正确解析。但是如前所述,我希望他们使用ImmunizationRecord的密钥,而不是学生。

任何建议和指导将不胜感激!

提前谢谢!

(已更新为其他示例以使其更有意义)

0 个答案:

没有答案