2

교사 (교사와 모든 지정된 강좌를 편집시 목록 상자에 표시하고자합니다 (다 대 다 관계 : 강좌, 교사 및 CourseTeacher). (이미 선택한 과목을 강조 표시하고 사용자가 선택을 변경하면 데이터베이스에 반영됩니다).EntityFramework에서 다 대다 저장하기

내 문제는 Get 메소드에서 작동하지만, 교사와 관련 코스를 업데이트하기 위해 게시 할 때 모든 코스가 지정되어 있지만 자동으로 (교사 정보를 업데이트하지만 선택된 코스는 업데이트하지 않음) 게시하지 않습니다. 개체에.

저는 MVC를 처음 사용하기 때문에 모델이 올바른지 확실하지 않습니다. 하지만 문제는 post 메서드에있는 것 같아요. (코드의 마지막 부분은 내 의견을 참조하십시오).

명확해야합니다. 나는 이미 코스리스트를 가지고있다. 나는 그 (것)들을 몇몇 교사와 관련시키고 싶다.

지금까지했던 어떤 : 뷰 모델

public class TeacherEditor 
    { 
     public Teacher Teacher { get; set; } 
     public int[] SelectedCourseIds { get; set; } 
     public MultiSelectList Courses { get; set; } 
    } 

교사 모델 :

public class Teacher 
    { 
     public int TeacherID { get; set; } 

     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public ICollection<Course> Courses { get; set; } 

      public Teacher() 
      { 
       Courses = new HashSet<Course>(); 
      } 
    } 

보기 :

<div class="editor-field"> 
        @Html.ListBoxFor(model=>model.SelectedCourseIds, Model.Courses) 
     </div> 

컨트롤러 GET :

public ActionResult Edit(int id = 0) 
     { 
      var teacher = db.Teachers.Include(x=>x.Courses).Where(x=>x.TeacherID==id).SingleOrDefault(); 
      if (teacher==null) 
      { 
       return HttpNotFound(); 
      } 
      var selectedCourses = teacher.Courses.Select(x=>x.CourseID); 
      var model = new TeacherEditor 
      { 
       Teacher = teacher, 
       Courses = new MultiSelectList(db.Courses, "CourseID", "Name", selectedCourses), 
       SelectedCourseIds = selectedCourses.ToArray() 
      }; 
      if (model == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(model); 
     }  

컨트롤러 POST는 :

[HttpPost] 
     public ActionResult Edit(TeacherEditor teacherEditor) 
     { 
      if (ModelState.IsValid) 
      { 
        foreach (var id in teacherEditor.SelectedCourseIds) 
        { 
         Course course = db.Courses.Where(x=>x.CourseID==id).SingleOrDefault(); 
         teacherEditor.Teacher.Courses.Add(course); //Here I'm adding courses back to Teacher object for save. 
        } 
       db.Entry(teacherEditor.Teacher).State = EntityState.Modified; /?This doesn't save records to my relationship table. Why? 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(teacherEditor); 
     } 
+0

귀하의 예제가 포함되어

같은 것을보십시오. 내가 올바르게 이해했는지 확인하기 위해 선택한 모든 코스를 선생님에게 다시 보충하려고합니다. 이미 선생님의 코스리스트에 포함되어있는 목록에있는 코스를 어떻게 설명합니까? –

+0

@DaveA, 지금은 안됩니다. EF는 이미 존재하는 코스를 추가하는 것을 건너 뛰기에 충분히 똑똑하지만. 추가하기 전에 조건을 추가 할 수는 있지만 여전히 저장되지는 ​​않습니다. – user194076

+0

나는 약간의 깊이가 있습니다. EF를 꽤 많이 사용하지만 전문가는 아닙니다. 내가 충분히 긴 문제에 집중할 때 나는 그것을 해결한다. 이 경우 내 본능은 기존의 것을 첨부하거나 무시할 것입니다. 나는 현재 코스가 회원인지 아닌지 확인하기 위해 전화를 할 것입니다. –

답변

3

귀하의 문제는 당신이 MVC (ICollection에)에서 인터페이스에 POST에 결합 할 수 없다는 것입니다. DefaultModelBinder는 추상 기본 클래스 및 인터페이스에 대한 바인딩을 지원하지 않습니다. ICollection<Course> CoursesList<Course> Courses과 같은 구체적인 구현으로 변경하십시오.

그러면보기에서 인덱스 표기법을 사용하여 코스를 표현할 수 있습니다. ListBoxFor에서이를 처리해야합니다.

public class Teacher 
    { 
     public int TeacherID { get; set; } 

     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public IQueryable<Course> Courses { get; set; } 

     public Teacher() 
     { 
      Courses = new IQueryable<Course>(); 
     } 
    } 

public class TeacherEditor 
    { 
     public Teacher Teacher { get; set; } 
     public int[] SelectedCourseIds { get; set; } 
     public List<Course> CourseList 
     { 
      get { return Teacher.Courses.ToList(); } 
      set { Teacher.Courses = value.ToList(); } 
     } 
    } 
+1

답변 해 주셔서 감사합니다. List EF로 변경하면 관계 테이블 (teacherCourse)이 생성되지 않습니다. 이 작업을 올바르게 수행하는 방법에 대한 예제를 보여줄 수 있습니까? – user194076

+0

@ user194076이 [link] (http://weblogs.asp.net/manavi/archive/2011/05/17/associations-in-ef-4-1-code-first-part-6-many-valued- associations.aspx)가 도움이 될 수 있습니다. 여기서는 EF에서 여러 가지 값의 연관을 구현하는 방법에 대해 설명합니다. – cubski

+0

이 답변을 편집했습니다 - 위를 참조하십시오 – viperguynaz