2011-05-03 4 views
1

몇 가지 다른 방법으로 여러 번 질문을했지만 아직 응답이 없습니다. 내 솔루션이 너무 복잡한 것처럼 느껴지기 때문에 나는 다시 시도하고있다. 나는 더 간단한 것을 놓치고 있어야한다.다 대 다 관계 업데이트

MVC 3 응용 프로그램에서 EF 4.1, POCO, DbContext API, AutoMapper 및 Razor를 사용합니다.

두 개의 엔티티 인 제안서와 카테고리 태그 사이에 다 대다 관계가 있습니다. 카테고리 태그 컬렉션을 포함하여 제안서를 ProposalViewModel에 성공적으로 매핑 (Automapper) 할 수 있습니다.

내보기에서 나는 선택한 태그의 ID를 저장하는 요소를 동적으로 생성하여 태그를 추가, 업데이트 및 제거 할 수있는 javascript를 사용합니다.

각 CategoryTag의 ID 속성만으로도 CategoryTags 컬렉션이 채워진 상태로 내 ViewModel을 내 컨트롤러에 성공적으로 게시 할 수 있습니다.

ViewModel을 내 컨트롤러에 다시 게시 할 때 ViewModel에서 태그를 가져 오는 방법을 모르고 db.SaveChanges()가 데이터베이스를 올바르게 업데이트하는 방식으로 모델에 추가합니다.

내가 어떤 성공을 했어 방법은합니다 (.add를 호출 한 후, (다르게 야밀에 의해) 매핑에 CategoryTags 모음을 분리 각 태그를 통해 반복하고 수동으로 맥락에서 그것을보고하는 것입니다) 방법. 이것은 내가 잘못하고 있다고 믿게하는 여러 가지 이유 때문에 엉성함입니다.

누구든지 어떤 방향으로 제공 할 수 있습니까?

UPDATE : 내 기능 코드, 관심있는 사람들을위한

:

  Dim p As New Proposal 
      Dim tempTag As CategoryTag 
      p = AutoMapper.Mapper.Map(Of ProposalViewModel, Proposal)(pvm) 

      db.Proposals.Attach(p) 
      db.Entry(p).Collection("CategoryTags").Load() 

      For Each ct In pvm.Tags 
       tempTag = db.CategoryTags.Find(ct.Id) 

       If tempTag Is Nothing Then 
        Continue For 
       End If 

       If ct.Tag = "removeMe" Then 
        p.CategoryTags.Remove(tempTag) 
        Continue For 
       End If 

       p.CategoryTags.Add(tempTag) 
      Next 


      db.Entry(p).State = EntityState.Modified 
      db.SaveChanges() 
      Return RedirectToAction("Index") 

답변

4

유일한 작업 방법은 수동으로하고있다 - 당신이 원하는 경우에 당신이 full description of the problem을 읽을 수 있습니다. 설명은 ObjectContext API와 관련이 있지만 DbContext API는 동일한 문제를 겪고있는 래퍼 일뿐입니다. 실제로이 시나리오에서는 DbContext API가 더 많은 문제를 겪습니다. 따라서 수동으로 관계를 설정하여 솔루션을 건너 뜁니다.

요컨대. 컨트롤러에 다시 데이터를 게시 한 후에는 새로운 컨텍스트 인스턴스를 만들고 Proposal을 첨부하고 CategoryTags을 구현해야합니다. 그러나 그 후에는 변경 사항에 대해 상황을 알려야합니다. 즉, 제안서에 추가 된 태그와 제거 된 컨텍스트를 말해야합니다. 그렇지 않으면 데이터베이스의 데이터와 자동 병합을 수행하지 않기 때문에 컨텍스트가 변경 사항을 처리 할 수 ​​없습니다.

가장 쉬운 방법은 현재 Proposal과 관련된 CategoryTags을 데이터베이스 (= 연결된 인스턴스가 있음)로로드하고 들어오는 데이터를 첨부 된 개체 그래프로 병합하는 것입니다. 게시 된 값을 기반으로 태그를 수동으로 제거하고 추가한다는 의미입니다.

+0

Ladislav, Thak 당신이 듣고 싶었던 불행한 대답입니다. 이것이 유일한 방법 일 경우, EF 4.2에서이 문제를 다루기를 기대합니다. :) –

+0

20 번 이상 비슷한 질문에 답한 후에이 문제에 대한 자동 해결책이 없을 수도 있습니다. 문제. 단순히 엔티티를 분리했다면 EF에 무슨 일을했는지 ​​반드시 말해야합니다. 삽입, 업데이트, 삭제를 수동으로 수행하려는 경우와 같습니다. 삭제 된 내용과 삽입 된 내용을 알아야합니다. –

+0

나는 그것이 의미가 있다고 생각한다. EF가 당신의 분리 된 존재와 현재의 차이점을 바탕으로 적어도 "auto reconcilier"를 가지고 있다면 좋을 것이다. 여러 번 답변을 드려 죄송합니다.이 주제에 대해 확실한 답변을 찾지 못했습니다. –