2017-12-11 18 views
0

私は記事を格納するためのEFコードの最初のMVCモデルを作成しています。EFコード最初の自己参照複合キー

各記事は複数のページを持つことができるので、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; } 
    } 
+0

なぜ自分自身を参照するコンポジットキーがあるのですか?あなたは記事を保管することができ、それは別々のページです。あるいは、記事にも自分自身への参照が必要ですか? – lloyd

+0

記事に親と子の記事が必要なので、自己参照が必要になります。私はまた、複合キーを使ってページングされた記事をしたい。だからこそ、自分自身を参照する複合キーが必要です。 –

+0

ページを別々に保存することは、私がこのように動作することができなければ私が検討するものです。 –

答えて

1

私はあなたがこのような場合には、適切にEFを使用していないということだと思います取得コントロールを使用しようとします。 私はあなたのコードをcorectly理解している場合、EFはオブジェクトを自分自身に参照しようとします。熱心な読み込みシナリオを使用している場合は、Stackoverflow例外が発生します。つまり、ArticleIDとArticlePageNoで形成された複合キーとして主キーと外部キーの両方を指定して、ArticleとArticleの間に1対1の関係を定義しています。 EFが消化できるものではありません。 私はあなたのデータを改造することをお勧めします:あなたは記事とページの間に1対多の関係があり、記事と記事の間には1対多の関係があります。コードは次のようsomehingになります:

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; } 
} 
0

をこのモデルは、私がしようとするが、私は私のアプローチを再考するフィードバックを次れたものを実現しています。

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; } 

} 
関連する問題