【发布时间】:2014-03-18 08:25:20
【问题描述】:
有关一些背景信息,请参阅以下帖子:
Entity framework one to zero or one relationship without navigation property
我一直认为ForeignKey 用于显示类中的哪个属性包含确定导航属性的 ForeignKey,例如
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("DeferredDataId")]
public virtual DeferredData DeferredData { get; set; }
}
但是,我在链接的帖子中发现这是不对的,因为 DeferredData 的主键被称为 Id 我实际上需要:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
}
即ForeignKey 用于指向其他类。
然后我开始更改其他一些参考:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("UserId")]
public virtual UserProfile SignedOffBy { get; set; }
}
但是,这失败了。结果发现,ForeignKey 需要指向 MemberDataSet 类上的 Id。
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("SignedOffById")]
public virtual UserProfile SignedOffBy { get; set; }
}
我认为这是因为第二个关系是一对多,而第一个是一对零或一,并且实际上关系的主要目的不同,但我希望对此/对好文章的引用有所澄清,这样我就可以了解正在发生的事情以及 ForeignKey 在做什么。
在上面的示例中,我还希望清楚地了解public int? DeferredDataId { get; set; } 如何适合等式,因为它没有明确链接到DeferredData。我很高兴这将按照惯例匹配,但我将如何明确地告诉它,例如如果它有不同的名称?我在这篇文章中看到的所有例子都是关于使用 ForeignKey 属性的,但这并不是上述所有情况下的答案!
非常感谢所有帮助 - 希望了解问题而不是解决特定问题,因为我的模型中有很多参考资料,因此需要确定对每个参考资料采取什么方法。
谢谢。
编辑
添加了其他类来帮助:
public class DeferredData
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
//other properties
}
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
//other properties
}
【问题讨论】:
标签: c# entity-framework foreign-keys code-first shared-primary-key