見一些背景下一篇:瞭解ForeignKey的屬性首先
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; }
}
我相信這是因爲該第二關係是一對多而第一是一個0或1,並且有效的關係的主端不同,但是我希望在這個/引用一些清晰度到好的文章,所以我可以理解正在發生的事情以及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
}
檢查標題* enity *框架。 – Agostino