簡體   English   中英

EF代碼優先自引用復合密鑰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM