컬렉션 작업 방법

c# entity-framework entity-framework-core

문제

누구든지 EF에서 컬렉션 작업 방법을 설명하는 미니 가이드를 작성할 수 있습니까?

예를 들어 다음과 같은 모델이 있습니다.

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<PostComment> Comments { get; set; }
}

public class PostComment
{
    public int Id { get; set; }
    public BlogPost ParentPost { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
}

컨텍스트 클래스 :

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<PostComment> Comments { get; set; }
}

public class PostComment
{
    public int Id { get; set; }
    public BlogPost ParentPost { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
}

내 코드에서 Posts.Add 등을 사방에 사용할 수 있도록 OnModelCreating 메서드에 무엇을 작성해야합니까?

수락 된 답변

다음은 Entity Framework Core의 탐색 속성 작업에 대한 팁입니다.

팁 1 : 컬렉션 초기화

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

팁 2 : HasOneWithMany 또는 HasManyWithOne 메서드를 사용하여 빌드

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

팁 3 : 컬렉션을 열심히로드하십시오.

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

팁 4 : 열심히하지 않았다면 명시 적으로로드하십시오.

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

인기 답변

Comments 탐색 속성이 제대로 작동하지 않는 것 같습니다. BlogPost 모델에 실제 참조 필드를 PostComment 테이블에 제공하려고합니다. 또한 EF 명명 준수를 위해 PostComments의 탐색 속성 이름을 바꿉니다.

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

이것도 작동하지 않는다면 수동으로 관계를 정의해야하지만, 도움이되기 전에 db에이 두 테이블의 스키마를 제공하는 것이 좋습니다.

업데이트 01 :

첫 번째 팁 : 단 하나의 명명 된 테이블을 사용하고 있습니다. 이것은 EF 명명 규칙을 따르지 않습니다. Pluralization는 꺼야합니다. 이 줄을 OnModelCreating 메서드에 OnModelCreating 됩니다.

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

두 번째 팁 : 이전의 조언은 완전히 잘못 되었습니다. 더 이상 고려하지 말고 이전 모델 스키마 만 사용하십시오. 이제 댓글과 게시물 사이에 일대 다 관계가 있다고 가정합니다.

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

더 많은 정보 :

EF 일대 다 관계 튜토리얼

관계 및 탐색 속성

Fluent API를 사용한 관계 구성




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.