2013-06-05 6 views
1

many to many relationship에 데이터를 삽입하는 방법은 무엇입니까? 이 코드asp.net mvc 4 many-to-many 관계 데이터를 삽입하는 방법

public class Article 
{ 
    public int ArticleID { get; set; } 
    public string Title { get; set; } 
    public DateTime Date { get; set; } 
    public string Anotation { get; set; } 
    public string Body { get; set; } 
    public virtual ICollection<ArticleTag> ArticleTags { get; set; } 
} 

public class ArticleTag 
{ 
    public int ArticleTagID { get; set; } 
    public string TagName { get; set; } 
    public virtual ICollection<Article> Articles { get; set; } 
}  

에 의해 definded이 두 모델을 가지고 이제 큰 Q는 테스트 데이터와 데이터베이스를 시드하는 방법이다. 난 정상적인 테이블과 쿼리 및 MVC EF에서 나는 꽤 초보자입니다 몇 가지 경험이 있습니다. 일반적으로 연관 테이블을 만들고이 모델들 사이의 링크를 정의합니다. 그러나 나는 많은 튜토리얼을 읽었으며 아무도 결정 론적 인 방법으로 그것을 제공하지 못했습니다. 그래서 당신은 내 혼란을 상상할 수 있습니다.

경우 내가 전에 말했듯이, 나는 모델 빌더를 통해 ASSOC 테이블을 "창조"하고 내가 내 DB를 시드하는 가장 쉬운 방법을 알 필요가 :(

public class DatabaseContext : DbContext 
{ 
    public DbSet<Article> Articles { get; set; } 
    public DbSet<ArticleTag> ArticleTags { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Article>(). 
      HasMany(at => at.ArticleTags).WithMany(a => a.Articles). 
      Map(m => m.MapLeftKey("ArticleID").MapRightKey("ArticleTagID").ToTable("Articles_To_ArticleTags")); 
    } 
} 

끝나는 곳이다 (상관 없어 ASSOC 테이블을 삭제)과는 MVC에서 어떻게 작동하는지 이해하기 - 연결, 두 모델을 연결하는 두 개의 특정 인스턴스, ..., 그리고 모두를 코딩하는 방법을

들으 어떤 대답을 그래서

답변

2

.. 마침내 해결했습니다! 좋은 게시글을 찾았습니다. herethis one 함께 나는 그것을 만들었다. 내가해야 할 일을했을 것을 한마디로

:

  1. 내 빌더 링크 제거는 - EF 자체가 약간은
  2. 모델을 수정 생성 링크 (자신의 ASSOC 테이블)
  3. 를 생성 DatabaseInitializer
  4. Application.Start() 메서드에 Global.asax 추가 Database.SetInitializer (새 DatabaseInitializer());
  5. 가 자체 하는 것을 잊지 마세요 선언DBcontext
  6. 는 일반적으로보기

수정 생성자 (절대적으로 필요한 경우 확실하지에에서 사용을 ConnectionString을, 어쩌면 같은 일을 같은 기본/기본 생성자) :

public class Article 
{ 
    public int ArticleID { get; set; } 
    public string Title { get; set; } 
    public DateTime Date { get; set; } 
    public string Anotation { get; set; } 
    public string Body { get; set; } 
    public string SourceLink { get; set; } 
    public virtual List<ArticleTag> ArticleTags { get; set; } 

    public Article() 
    { 
     ArticleTags = new List<ArticleTag>(); 
    } 
} 

public class ArticleTag 
{ 
    public int ArticleTagID { get; set; } 
    public string TagName { get; set; } 
    public virtual List<Article> Articles { get; set; } 

    public ArticleTag() 
    { 
     Articles = new List<Article>(); 
    } 
} 

그리고 DatabaseInitializer

public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext> 
{ 
    protected override void Seed(DatabaseContext context) 
    { 
     ArticleTag tag1= new ArticleTag { TagName = "aaaa" }; 
     ArticleTag tag2= new ArticleTag { TagName = "bbbb" }; 
     ArticleTag tag3= new ArticleTag { TagName = "cccc" }; 
     var articleTags = new List<ArticleTag> { tag1, tag2, tag3}; 
     articleTags.ForEach(i => context.ArticleTags.Add(i)); 
     context.SaveChanges(); 


     Article a1 = new Article 
     { 
      Title = "Title1", 
      Date = DateTime.Now, 
      Anotation = "Anotation1", 
      Body = "article_1", 
      ArticleTags = new List<ArticleTag> { tag1 } 
     }; 
     Article a2 = new Article 
     { 
      Title = "Title12", 
      Date = DateTime.Now, 
      Anotation = "Anotation2", 
      Body = "article_2", 
      ArticleTags = new List<ArticleTag> { tag2, tag3 } 
     }; 
     var articles = new List<Article> { a1, a2 }; 
     articles.ForEach(a => context.Articles.Add(a)); 
     context.SaveChanges(); 
    } 
} 
+0

오프 물론, 4 단계에서 당신은 아마 * 사용하여 문을 몇 가지를 추가해야합니다 –