2017-12-11 14 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는 그 자체로 객체를 참조하려고합니다. 따라서 ArticleID와 ArticlePageNo로 구성된 복합 키로 기본 키와 외래 키를 모두 지정하여 Article과 Article간에 1 대 1의 관계를 정의하고 있습니다. EF가 소화 할 수있는 것은 아닙니다. 데이터를 재구성하는 것이 좋습니다. 따라서 기사와 페이지 사이에 일대일 관계가 많으며 기사와 기사간에 일대일 관계가 많습니다. 코드는 다음과 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; } 

}