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
}