2014-09-18 4 views
0

ASP.NET MVC 프로젝트에서 저장소의 SaveItem 메서드로 업데이트하려고합니다. Entity Framework 6.1을 사용합니다. 나는 예외가있다. 이 문제를 어떻게 해결할 수 있습니까?리포지토리의 개체를 수정할 수 없습니다.

동일한 유형의 다른 엔터티가 이미 동일한 기본 키 값을 갖고 있기 때문에 'Domain.Entities.Post'유형의 엔터티를 연결하지 못했습니다. 이것은 'Attach'방법을 사용하거나 그래프의 엔티티 중 하나가 충돌하는 키 값을 갖는 경우 엔티티의 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 이는 일부 엔티티가 새롭고 아직 데이터베이스 생성 키 값을 수신하지 않았기 때문일 수 있습니다. 이 경우 'Add'메소드 또는 'Added'엔티티 상태를 사용하여 그래프를 추적 한 다음 비 신규 엔티티의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정하십시오.

내 저장소 : 나는 편집의 논리를 imlpemented 컨트롤러에서

public class BlogRepository<T> : IBlogRepository<T> where T : class 
{ 
    private readonly DbContext context; 
    private readonly IDbSet<T> dbSet; 
    public BlogRepository() 
    { 
     this.context = new BlogDbContext(); 
     dbSet = context.Set<T>(); 
    } 

    public BlogRepository(DbContext context, IDbSet<T> dbSet) 
    { 
     this.context = context; 
     this.dbSet = dbSet; 
    } 

    public void SaveItem(T item) 
    { 
     object value = Reflector.GetPropertyValue(item); 
     var foundItem = dbSet.Find((int) value); 
     if (foundItem == default(T)) 
      dbSet.Add(item); 
     else 
     { 
      context.Entry(item).State = EntityState.Modified; 
     } 
     context.SaveChanges(); 
    } 

    public void Delete(T item) 
    { 
     dbSet.Remove(item); 
     context.SaveChanges(); 
    } 

    public T GetById(int id) 
    { 
     return dbSet.Find(id); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return dbSet.AsEnumerable(); 
    } 
} 

public class PostController : Controller 
{ 
    private readonly IBlogRepository<Post> blogRepository; 
    public PostController(IBlogRepository<Post> blogRepository) 
    { 
     this.blogRepository = blogRepository; 
    } 

    public ActionResult Index(int id = 1) 
    { 
     Post post = blogRepository.GetById(id); 
     return View(post); 
    } 

    public ActionResult Edit(int id) 
    { 
     Post post = blogRepository.GetById(id); 
     return View(post); 
    } 

    [HttpPost] 
    public ActionResult Edit(Post post) 
    { 
     if (ModelState.IsValid) 
     { 
       blogRepository.SaveItem(post); 
       return RedirectToAction("Index", new { id = post.Id }); 
     } 

     return View(post); 
    } 

    public ActionResult Create() 
    { 
     return View("Edit", new Post {Date = DateTime.Now}); 
    } 

} 
+0

중단 점이있는 디버그 모드로 실행하려고 시도 했습니까? –

+0

예 시도해 보았습니다. 예외가 발생했습니다 – MasterMedia

+0

그리고 변수 값이 어땠는지, QuickWatch 또는 무언가를 사용해 보았습니다. –

답변

0

오류 메시지가 말한다 : 그래프의

"있는 경우 엔티티에 충돌하는 키 값이 있습니다. "

게시물이 새로운 요소이지만 이미 데이터베이스에있는 요소 (작성자?)와 연결되어있을 수 있습니다. 그런 다음 게시물을 추가하기 전에 해당 항목을 "첨부"해야합니다.


덧붙여서, 나는 엔티티 클래스를 뷰의 모델로 직접 사용하지 않는 것이 좋습니다.

표시해야하는 정보를 노출하는 "PostViewModel"클래스를 사용하는 것이 좋으며 편집 데이터가 포함 된 분리 된 "EditPostViewModel"도 좋습니다. 컨트롤러는이 클래스를 구성하여 뷰에 보내야하며 Post 엔티티를 만들어 리포지토리에 보내야합니다 (Service 클래스에서 더 잘 수행됨).

+0

첨부하려고 시도했지만 작동하지 않습니다. – MasterMedia

+0

"db.Authors.Attach (post.Author);"와 같은 것이 있습니까? – DaniCE

+0

contect.DbSet.Attach (item) 포스트 엔티티가 post.Author와 같은 속성으로 다른 엔티티를 가지고있는 경우 동일한 예외가 발생합니다 ( – MasterMedia

관련 문제