컬렉션 작업 방법

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 PostContext : DbContext
{
    public DbSet<BlogPost> Posts { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Posts;Trusted_Connection=True;MultipleActiveResultSets=true");

    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

    }
}

내 코드에서 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 메서드를 사용하여 빌드

protected override void OnModelCreating(ModelBuilder model)
{
    model.Entity<Post>()
        .HasMany(p => p.Comments).WithOne(c => c.Post)
        .HasForeignKey(c => c.PostId);
}

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

var posts = db.Posts.Include(p => p.Comments);

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

db.Comments.Where(c => c.PostId == post.Id).Load();

인기 답변

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 됩니다.

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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

protected override void OnModelCreating(ModelBuilder builder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<PostComment>().HasRequired<BlogPost>(c => c.ParentPost)
            .WithMany(p => p.Comments);

    base.OnModelCreating(builder);

}

더 많은 정보 :

EF 일대 다 관계 튜토리얼

관계 및 탐색 속성

Fluent API를 사용한 관계 구성



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow