[英]EF Code First Self-Referencing Composite Key
我正在制作一個EF代碼優先的MVC模型來存儲文章。
每篇文章可以有多個頁面,因此我將該鍵做成了ID加頁碼的復合鍵。
我還希望文章包含子文章,因此我希望文章使用外鍵自我引用。
由於密鑰是復合密鑰,因此我正在努力進行自引用。 當我搭建模型並嘗試使用控件時,出現“ System.StackOverflowException”
public class Article
{
[Key, Column(Order = 0)]
public int ArticleID { get; set; }
[Key, Column(Order = 1)]
public int ArticlePageNo { get; set; }
public string ArticleTitle { get; set; }
public string ArticleBody { get; set; }
[ForeignKey("ArticleID, ArticlePageNo")]
public Article ArticleParent { get; set; }
}
在這種情況下,我確實認為您沒有正確使用EF。 如果我從根本上理解您的代碼,EF會嘗試將對象引用為其自身,並且,如果您使用的是急切的加載方案,則將導致Stackoverflow異常。 因此,您實際上是在Article和Article之間定義了一對一的關系,同時指定了主鍵和外鍵作為由ArticleID和ArticlePageNo組成的復合鍵。 EF不能消化。 我建議您重塑數據:因此,文章和頁面之間應具有一對多的關系,而文章和文章之間應具有一對多的關系。 代碼看起來像這樣:
public class Article
{
// object unique ID
public int Id { get; set; }
public string Title { get; set; }
// parent Id used as foreign key
public int? ParentArticleId { get; set; }
// navigational property for parent
public virtual Article ParentArticle { get; set; }
// navigational property for children
public virtual ICollection<Article> Articles { get; set; }
// navigational property for article pages
public virtual ICollection<ArticlePage> Pages { get; set; }
}
public class ArticlePage
{
// object unique ID
public int Id { get; set; }
public string PageBody { get; set; }
// parent Id used as foreign key
public int ArticleId { get; set; }
// navigational property for parent article
public virtual Article { get; set; }
}
該模型可以實現我試圖做的事情,但是根據反饋,我可能會重新考慮自己的方法。
public class Article
{
[Key, Column(Order = 0)]
public int ArticleID { get; set; }
[Key, Column(Order = 1)]
public int ArticlePageNo { get; set; }
public string ArticleTitle { get; set; }
public string ArticleBody { get; set; }
public int? ParentArticleID { get; set; }
public int? ParentArticlePageNo { get; set; }
[ForeignKey("ParentArticleID,ParentArticlePageNo")]
public virtual Article ArticleParent { get; set; }
public virtual ICollection<Article> Articles { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.