2011-02-28 3 views
2

새로운보기로 갈 필요없이 사용자가 컬렉션에 항목을 추가 할 수있는보기를 원합니다 (이 시나리오는 사용자가 작업 경험, 기술 등에 관한 정보를 추가하는 일종의 CV 사이트이며 각 작은 것을 추가하기 위해 새로운보기로가는 것은 터무니없는 것처럼 보일 것입니다).EntityCollection에 추가하면 Entity Framework의 컬렉션 끝에 추가됩니까?

그래서 이미 추가 된 항목에 대한 여러 텍스트 상자를 보여주는 편집보기가 있으며 사용자가 항목을 추가하면 새로운 항목을 가져 오는 방법으로 이동하는 ajax 호출이 있습니다. 질문에 지금

public ActionResult Edit(int id) 
    { 
     Consultant consultant = _repository.GetConsultant(id); 
     var vm = GetViewModel(consultant); 
     return View(vm); 
    } 

    private DetailsViewModel GetViewModel(Consultant consultant) 
    { 
     return new DetailsViewModel 
     { 
      Programs = consultant.Programs.ToList(), 
      Consultant = consultant 
     }; 
    } 
    public ActionResult NewProgram(int id) 
    { 
     //TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end... 
     Consultant consultant = _repository.GetConsultant(id); 
     consultant.Programs.Add(new Program()); 
     _repository.Save(); 
     var vm = GetViewModel(consultant); 
     return PartialView("ProgramList", vm); 
    } 

: 여기

이 문제의 방법 인 NewProgram도 메서드를 호출 할 때, 컨설턴트 객체에 새로운 프로그램을 추가하고 다시 보내 새로운 뷰 모델을 만들지 만 새 프로그램을 끝에 있지 않고 EntityCollection 시작 부분에 추가합니다. 그러나 전체 양식을 게시하고 편집보기를 다시 열면 목록에 새로 추가 된 프로그램이 배치됩니다. 이것은 매우 이상합니다. 사용자는 목록 시작 부분에 항목을 추가한다고 생각하지만 다시 페이지로 돌아 가면 끝 부분에서 새 항목을 찾습니다.

왜 이렇게하고, NewProgram()의 끝에 새로운 프로그램을 직접 추가 할 수있는 방법이 있습니까?

누군가가 EF 개체로 직접 작업하는 대신 DTO를 사용하여 "ViewModel을 사용해야한다"고 생각한다면, 나는 꽤 오래 지금 그 길을 걷고 있습니다 (Entity Framework and MVC 3: The relationship could not be changed because one or more of the foreign-key properties is non-nullable), 지금까지 아무도 이를 달성하고 동일한보기에서 항목을 추가 및 제거 할 수있는 방법을 명시 적으로 보여주었습니다. 컬렉션의 인덱스를 유지 관리하는 데 문제가 있거나 Entity Framework에서 저장하지 못하게됩니다 ... 그리고 코드가 악몽이되었습니다.

나는 적어도 이해할 수있는 코드가 이러한 방식으로, 그리고 유일한 것은 ...이 컬렉션의 끝에 추가 즉, "정상적인"순서로 이루어를 부가 한 필요

어떤 아이디어인가? BTW

:

이 작동하지만, 먼저, 컨설턴트 객체에 새로운 프로그램을 추가 새로운 프로그램없이 뷰 모델을 만든 다음 별도로 뷰 모델에 추가해야 할 매우 불필요한 것 같습니다 ...

public ActionResult NewProgram(int id) 
    { 
     //TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end... 
     Consultant consultant = _repository.GetConsultant(id); 
     var vm = GetViewModel(consultant); 
     var program = new Program(); 
     consultant.Programs.Add(program); 
     _repository.Save(); 
     vm.Programs.Add(program); 
     return PartialView("ProgramList", vm); 
    } 

답변

1

http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx에 따르면, 탐색 속성 ProgramsDoLazyLoad() 방법의 어떤 종류를 호출 무시됩니다. 속성 인스턴스 자체는 반드시 변경하지 않아도되므로 실제로 비동기에 의해 DoLazyLoad()이 표시 될 수 있습니다.이 인스턴스는 사용자가 알아 차리고있는 동작을 설명합니다.

어쨌든 목록을 평가하고 있으므로 새 프로그램을 추가하기 전에 ToList()으로 전화 할 수 있습니다. 그것은 단지 라인을 약간 변경해야합니다 :이 실제로 내 "비동기"이론과 잘 작동하지 않습니다

consultant.Programs.ToList(); 
consultant.Programs.Add(new Program()); 

,하지만 :

consultant.Programs.ToList().Add(new Program()); 

이 작동하지 않는 경우를 시도 너를 도울지도 모른다.

+0

글쎄, 후자는 실제로 다소 효과가 있었지만 실제로는 효과가있었습니다 ...하지만 감사합니다. 어쨌든 조금 낫습니다. – Anders

+0

@ 앤더스 스벤손 (Sndersson) : 나는 그것이 효과가 없을 것이라고 기대했다. 오름차순 ID로 정렬하는 것과 같이보기에서 프로그램의 순서를 지정하면이 "해킹"을 피할 수 있습니다. –