EntityFramework 6中的关系存在一些问题。
我知道可以使用DataAnnotations或FluentApi,但我都可以使用。
这是我要完成的关系的一个例子:
这似乎很简单,但是似乎并没有达到预期的效果。
示例代码(从实际代码更新)
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的密钥,而不是学生。
任何建议和指导将不胜感激!
提前谢谢!
(已更新为其他示例以使其更有意义)