일대일관계에서 무한루프가 발생하고 있습니다.

EF Core 공식문서에서 일대일관계 문서의 코드를 사용하고 있습니다.

양방향필수관계를 구현하려 합니다. 하지만 공식문서에서 제공하는 코드를 실행하면 Blog.BlogHeader.Blog.BlogHeader.Blog.BlogHeader… 무한루프에 빠지게 됩니다.
관계 탐색, 관계 검색 규칙 같은 다른 문서들도 찾아보았지만 무한루프에 빠지는 내용에 대해 설명하는 글이 보이지 않습니다.

BlogHader.Blog에 [JsonIgnore]특성을 주면 해결되지만 이유가 무엇인지, 원리가 무엇인지에 대한 자료를 찾을 수 없습니다.
관련된 문서를 알고계신분이 있을까요…?

//부모
    public class Blog {
        public int Id { get; set; }
        public BlogHeader? Header { get; set; }
    }
//자식
    public class BlogHeader {
        [Key]
        [ForeignKey(nameof(Blog))]
        public int Id { get; set; }
        public Blog Blog { get; set; } = null!;
    }
2개의 좋아요

Id 프로퍼티를 기준으로 blog엔티티의 객체는 blogheader엔티티의 객체를 참조하거 blogheader엔티티의 객체는 blog엔티티의 객체를 서로 순환참조하는 형태인걸로 보이는데요… [jsonignore] 어트리뷰트를 선언하여 해결된다고 하실걸로 보아 해당 객체들을 json으로 직렬화하다가 문제가 발생하신걸로 추측됩니다.
제 추측이 맞다면

위 링크의 글을 참조하여 해결해 보심이 어떨까 합니다.

4개의 좋아요

우선, 링크된 예제의 코드와 보여 주신 코드가 다르다는 점을 말씀드리고 싶습니다.
링크의 예제 코드는 아래와 같습니다

// Principal (parent)
public class Blog
{
    public int Id { get; set; }
    public BlogHeader? Header { get; set; } // Reference navigation to dependent
}

// Dependent (child)
public class BlogHeader
{
    public int Id { get; set; }
    public int BlogId { get; set; } // Required foreign key property
    public Blog Blog { get; set; } = null!; // Required reference navigation to principal
}

BlogId에 할당해야 할 값을 Id 에 할당하니 무한 루프가 생기는 것 같습니다.

3개의 좋아요

@BigSquare 첨부해주신 이미지와 질문자의 샘플은
어트리뷰트 표현차이인거 같습니다!

혹시 모르니 @MAJG 댓글 달아주신것처럼 어트리뷰트를 전부 제거 한번 해보시는게 어떨가요?

제가보기엔 어트리뷰트 중복사용으로 인해 발생된거지않을까 싶습니다

1개의 좋아요

BlogHeader의 PK로 Blog의 PK를 사용하려고 합니다.
BlogHeader는 Blog에 필수적으로 종속되는 관계이고 단 하나만 존재하기 때문에 별도의 PK를 가질 필요는 없다고 생각합니다. 이런 모습의 관계는 많이 보일텐데 EF Core의 문서에서 왜 이 내용을 다루지 않는건지도 모르겠네요…(제가 못찾고 있는걸수도…)

2개의 좋아요

찾았습니다…
순환참조를 허용하지 않도록 직접 설정을 해주어야되네요

3개의 좋아요

@MAJG 해결하신 부분도 한번 소개해주시면 넘 좋을 것 같습니다. :smile:

1개의 좋아요

요청하신대로 글을 적긴했는데 이게 제대로 된 글인지는 모르겠습니다…
부족한 부분이나 수정해야될 내용이 있다면 말씀해주세요! 다시 적어보겠습니다…ㅠㅠ

3개의 좋아요