0

Entity Framework 4, POCO를 사용하는 다 대 다 삽입 프로세스에 익숙하지 않습니다. 게시물, 댓글 및 태그의 3 개 테이블이있는 블로그가 있습니다. 포스트 많은 태그을 가질 수 있으며, 태그많은 게시물에있을 수 있습니다. 여기에 포스트태그를 모델입니다 : 나는 새 게시물을 추가 해요 이제엔티티 프레임 워크 4 다 대다 삽입?

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

    [Required] 
    [StringLength(25, ErrorMessage = "Tag name can't exceed 25 characters.")] 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

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

    [Required] 
    [StringLength(512, ErrorMessage = "Title can't exceed 512 characters")] 
    public string Title { get; set; } 

    [Required] 
    [AllowHtml] 
    public string Content { get; set; } 

    public string FriendlyUrl { get; set; } 
    public DateTime PostedDate { get; set; } 
    public bool IsActive { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

, 내가 할 수있는 올바른 방법 일 것입니다 무슨 확실하지 않다. 나는 내가이 게시물 (이 부분은 이미 완료)에 대한 여러 태그를 선택할 수있는 텍스트 상자가있을 것이라고 생각하고 있는데, 내 컨트롤러에서 태그가 이미 존재하는지 확인하고, 그렇지 않다면 확인합니다. 새 태그를 삽입합니다. 그러나 EF 용으로 만든 모델을 기반으로 PostsTags 테이블을 만들지 않겠습니까? 아니면 태그와 포스트 테이블을 만들고 둘 사이에 링크를 만듭니 까?

게시물을 어떻게 삽입하고 태그를 해당 게시물로 설정합니까? 그냥 newPost.Tags = Tags입니까? (태그는 선택된 태그이며, 이미 존재하는지 확인해야합니까?) _post.Add(newPost);과 같은 태그가 있습니까?

감사합니다.

+0

안녕하세요 Saxman, 맞춤형 초기화 프로그램을 설정하고 있습니까? (DbDatabase.SetInitializer) 모델을 변경하는 경우 EF가 데이터베이스를 모델링하여 모델을 데이터베이스와 일치 시키도록해야합니다. 이것은 당신의 Many-to-Many가해야하는 것처럼 작동하지 않는 이유가 될 수 있습니다. 이 작업을 수행하는 방법을 알고 싶다면 알려주십시오! IMHO, 당신은 당신의 도메인 모델에서 조회 엔티티를 정말로 정의해서는 안됩니다. EF는 당신을 위해이 일을하고 그것을 투명하게 할 것입니다. – Paul

+0

안녕하세요 Paul, EF에서'DropCreateDatabaseIfModelChanges'를 설정 했으므로, 다 대 다 관계가 작동하는지 다시 한 번 확인해 보겠습니다. 감사. – Saxman

답변

0

)) 할 수없는 코딩이 조회 테이블의 ID없이 작업을 진행하는 것, 이것은 내가 그것을 작동하도록 한 일이다. 가장 효과적이고 효율적인 방법이 아닐 수도 있지만 작동합니다.

public class PostTagLookup 
{ 
    public int Id { get; set; } 
    public int PostId { get; set; } 
    public int TagId { get; set; } 

    public virtual Post Post { get; set; } 
    public virtual Tag Tag { get; set; } 
} 
1

데이터베이스에 다 대다 관계를 유지하지 말 것을 권합니다.

PostTag 또는 PostTagLookup과 같은 조회 표를 만드는 것이 좋습니다.

두 개의 열 (PostIdTagId)로 구성됩니다. his answer에 @Moyo에서 언급 한 바와 같이

엔티티 프레임 워크는 멋지고 룩업 테이블을 처리

엔티티 프레임 워크는 양쪽 기관의 수집 및 자체가 사라 본질적 것입니다 테이블에 매핑 테이블을 변환합니다.

+0

다소 혼란 스럽습니다. 다 - 대 - 다 관계를 갖는 것보다 더 나은 접근 방식이라고 생각합니까?그리고이 룩업 테이블 접근 방식을 사용하기 위해 내 모델을 변경해야합니까? 고맙습니다. – Saxman

+0

구현 방법에 따라 다릅니다. 테이블을 추가하고 솔루션을 업데이트하는 것만 큼 간단합니다. –

+0

참고 : 두 개의 엔티티 ID를 조회 테이블 (PostId, TagId)에만 넣고 여분의 Id 열은 제외해야합니다. 해당 Id 열을 추가하면 EF는 참조 된 대답에 설명 된 것처럼 조회 테이블을 '숨기지 않습니다.' –

1

나는 이것이 당신이 원하는 것이라고 생각합니다.

var tag = context.Tags.FirstOrDefault(x=>x.Name == name); 
if (tag == null) 
    context.Tags.AddObject(tag = new Tag { Name = name }); 
if (!post.Tags.Contains(tag)) 
    post.Tags.Add(tag); 

해피 뉴 년 내가

+0

4 번 줄까지 'tag'에 null 체크를하고 있지 않습니다. 이미 사용하고 있습니다. 따라서 2 행에서'NullReferenceException'을 얻을 수있는 기회가 있습니다. –

+0

감사합니다. – Saxman

+0

@ Dan Atkinson 덕분에 수정 될 것입니다. –

관련 문제