2012-11-05 3 views
3

많은 관계 삽입 중복 많은 나는 다음과 같이 내가이 개 POCO 클래스를 엔티티 프레임 워크 5.엔티티 프레임 워크 - 부모 테이블

를 사용하여 다 대다 관계로 간단한 삽입 할 노력하고있어. 엔티티 프레임 워크는 다음 세부 사항이 ArticleMap 코드에 규정 된의 세 번째 매핑 테이블과 함께 두 종류와 제 테이블을 생성합니다

public class CategoryMap : EntityTypeConfiguration<Category> 
{ 
    public CategoryMap() 
    { 
     this.ToTable("Categories"); 
     this.HasKey(x => x.ID); 

     this.Property(x => x.Title).IsRequired().HasMaxLength(255); 
    } 
} 

public class ArticleMap : EntityTypeConfiguration<Article> 
{ 
    public ArticleMap() 
    { 
     this.ToTable("Articles"); 
     this.HasKey(x => x.ID); 

     this.HasMany(x => x.Categories) 
      .WithMany(x => x.Articles) 
      .Map(x => 
      { 
       x.ToTable("MapArticleCats"); 
       x.MapLeftKey("CategoryID"); 
       x.MapRightKey("ArticleID"); 
      }); 

     this.Property(x => x.Title).IsRequired().HasMaxLength(255); 
     this.Property(x => x.Content).IsRequired().HasMaxLength(4000); 
    } 
} 

public class Category 
{ 
    public virtual string Title { get; set; } 
    public virtual DateTime EntryDate { get; set; } 
    public virtual DateTime LastUpdated { get; set; } 
    public virtual ICollection<Article> Articles { get; set; } 
} 

public class Article 
{ 
    public virtual string Title { get; set; } 
    public virtual string Content { get; set; } 
    public virtual DateTime EntryDate { get; set; } 
    public virtual DateTime LastUpdated { get; set; } 
    public virtual ICollection<Category> Categories { get; set; } 
} 

그리고 다음 유창하게 API를 매핑 코드

... (MapArticleCats), SQL Server에서 다음과 같습니다.

은 articleID - INT
카테고리 ID는

다음 코드 (몇 줄을 주거나 걸릴) 내 컨트롤러에있는 문서에 카테고리 추가를 -int.

IEnumerable<Category> GetCats = CategoryRepository.GetAll(); 

//DO SOME CODE TO FIGURE WHICH CATEGORIES I NEED. 
IEnumerable<Category> Categories = InferCategoriesFromPostedData(Model.Categories, GetCats); 

foreach (Category c in Categories) 
{ 
    Article.Categories.Add(c); 
} 

삽입시 이상한 동작이 나타나는 것 같습니다. 이 카테고리 테이블 (DUPLICATE)에 새로운 카테고리를 삽입하고 또한 상기 테이블 MapArticleCats 올바른은 articleID (대신에 원래의 ID)가 새롭게 생성 된 카테고리 ID를 삽입한다. 내가 잘못 갔어요 곳

은 사람이 볼 수 있을까요? 나는 (대규모 유죄 이전 것들 ...)이 문서를 제출하기 전에했던해야하는지

답변

3

확인에 유래를 검색 할 수 있었고 더 철저하게 물었다.

나는 무슨 일이 일어 났는지 전혀 위의 코드와는 아무 상관 없었다

내 문제 here에 대한 답을 발견했다. 나는 기본적으로 내 컨트롤러 (문서 저장소에 하나 카테고리 저장소에 다른)에 두 개의 데이터 컨텍스트를 주입하기 때문에 중복 레코드를 생성 한 때문이었다.

============================================= =====================================
중요 EDIT
=== ================================================== =============================

그냥

후에도 ... 내 대답에 정교하기 위의 수정 작업을 수행해도 여전히 업데이트가 불가능하다는 내 원래의 문제를 해결하지 못했습니다. e 탐색 속성 (범주). 이것에 대한 수정은 아래에서 찾을 수 있습니다 ...

저는 AsNoTracking()을 사용하여 엔티티 (Article)를 바인딩하는 모델이었습니다. 주 엔티티 자체를 업데이트하고 싶지만이 엔티티 탐색 속성. 예 : 필자의 경우 기사에서 카테고리를 추가/제거합니다.

문맥에서 엔티티를 분리하여 비슷한 방법을 시도했지만, 두 가지 방법으로 궁극적으로 네비게이션 속성을 조작 할 수없는 동일한 문제가 발생했습니다.

이 문제를 해결하는 방법은 단순히 정상적으로 엔터티를 바인딩하거나 선택하는 것입니다. No AsNoTracking(), 분리 없음. 문맥에 다시 엔티티를 부착 할 때 당신은 어떤 AsNoTracking/분리 쓰레기를하지 않고 그것을 선택하고 그것을 잘 업데이트됩니다 ...

public bool Attach(T entity) 
    { 
     T original = _dbSet.Find(entity.ID); 
     _dbContext.Entry(original).CurrentValues.SetValues(entity); 
     _dbContext.Entry(original).State = EntityState.Modified; 

     return this.Commit(); 
    } 

이 방법을 다음 코드를 사용합니다. 이것은 나를 위해 괜찮습니다, 어떤 사람들은 DB에 약간의 공격에 대한 여분의 여행을 찾을 수 있지만 모든 슬픔을 위해 나를 위해 잘 맞는. 당신의 dbcontext의 CaveChanges에서

0

호출 : 이것은 나를 위해 작동

ChangeTracker.DetectChanges() 

If ChangeTracker.HasChanges Then 
    ChangeTracker.DetectChanges() 
End If 

.

0

내 문제는 탐색 속성에 새 인스턴스를 설정하려고한다는 것이 었습니다.

내가 뭘하고 있었 :

IList<Category> categories = _categoryService.GetSomeCategories(); 
article.Categories = categories; 
_articleService.UpdateArticle(article); 

는 대신,이 같은 ICollection에의 기존 인스턴스에 유지해야합니다

IList<Category> categories = _categoryService.GetSomeCategories(); 
article.Categories.Clear(); 
foreach (var category in categories) { 
    article.Categories.Add(category); 
} 
_articleService.UpdateArticle(article); 

중복 PRIMARY KEY 오류가 사라 졌어요.