有关一些背景信息,请参阅以下帖子:
我一直认为这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; }
}
ieForeignKey
用于指向其他类。
然后我开始更改其他一些参考:
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
}