2015-08-20 32 views
0

有人能夠首先澄清在EF數據庫中有多少關係可以工作。 例如StudentCourse表中的關係是多對多的關係。我已經有一個數據庫。MVC EF數據庫首先多對多

所以我已經創建了一個.edmx

的類StudentCourses創建汽車。並且我在StudentCourseViewModel.cs中添加了一個新課程。這個想法是爲了控制與它的關係。 我StudentCourseViewModel containts如下:

public class StudentCourseViewModel 
{ 
    public Student Student{ get; set; } 
    public IEnumerable<SelectListItem> AllCourses{ get; set; }  
    private List<int> _selectedCourse; 
    public List<int> SelectedCourse 
    { 
     get 
     { 
      if (_selectedCourse == null) 
      { 
       _selectedCourse = Student.Courses.Select(m => m.pkID).ToList(); 
      } 
      return _selectedCourse; 
     } 
     set { _selectedCourse = value; } 
} 

public ActionResult Create() 
{ 
    ViewBag.Courses = new SelectList(db.Courses, "pkID", "Name"); 
    return View(); 
} 

public ActionResult Create(StudentCourseViewModel model,[Bind(Include = "pkID,Name")] Student student) 
{ 
    if (ModelState.IsValid) 
    { 
     if (student == null) 
      return HttpNotFound(); 

     // Remove items that were unselected 
     db.Courses.Where(m => !model.SelectedCourses 
      .Contains(m.pkID)) 
      .ToList() 
      .ForEach(m => student.Courses.Remove(m)); 

     // Add newly selected items 
     var existingClientIds = student.Courses.Select(m => m.pkID).ToList(); 
     db.Courses.Where(m => model.SelectedCourses.Except(existingClientIds) 
      .Contains(m.pkID)) 
      .ToList() 
      .ForEach(m => student.Courses.Add(m)); 

     db.students.Add(student); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(student); 
} 

我想現在該怎麼處理// GET:/Create和// POST:/Create 以及如何查看課程的create.cshtml名單? 我得到與上面的代碼以下錯誤:

型「System.Data.Entity.Infrastructure.DbUpdateException」的異常出現在EntityFramework.dll但在用戶代碼中沒有處理

更多信息:更新條目時發生錯誤。詳情請參閱內部例外。

+0

關係如何映射到數據庫中,你有一箇中間'StudentCourse'映射表嗎?目前尚不清楚您的「ViewModel」如何以任何方式映射關係。 –

+0

嘿ja我在數據庫中有一箇中間的StudentCourse表,但是當我創建.edmx時,StudentCourse表沒有顯示在模型中,而是用「*」符號表示多對多的鏈接。 –

+0

它聽起來好像已經被正確映射了,你沒有爲你的中間表生成一個類,並且只填充相關的導航屬性。你的控制器/視圖中有什麼是你遇到問題? –

回答

0

保存多對多關係可能有點棘手,因爲如果您不小心,EF可能會感到困惑,並且認爲您嘗試讀取現有項目並給您提供完整性錯誤。

您已經使用了一個視圖模型,其中包含一個包含ints列表的屬性。那很好。一半的戰鬥勝利了。現在,所有你需要的是一些邏輯來查詢所選擇的課程,並把它們添加到收藏Courses

// Remove items that were unselected 
db.Courses.Where(m => !model.SelectedCourse.Contains(m.Id)).ToList() 
    .ForEach(m => student.Courses.Remove(m)); 

// Add newly selected items 
var existingCourseIds = student.Courses.Select(m => m.Id).ToList(); 
db.Courses.Where(m => model.SelectedCourse.Except(existingCourseIds).Contains(m.Id)).ToList() 
    .ForEach(m => student.Courses.Add(m)); 

從技術上講,如果您正在編輯現有學生的唯一必要的。它不應該傷害到使用相同的代碼用於創建或編輯,但創造它可以被簡化爲:

student.Courses = db.Courses.Where(m => model.SelectedCourse.Contains(m.Id)); 

既然你創建一個全新的學生,有沒有現有的關係擔心。

+0

謝謝Chris,我添加了'ViewBag.Courses = new SelectList(db.Courses,「pkID」,「Name」);'給get/create函數,它給出了在創建視圖中選擇的課程列表。現在當我選擇一個課程並輸入create時,我在'db。SaveChanges();',那是因爲提取的數據與數據庫不匹配,所以我不知道如何解決的是如何解決這個問題,我應該將StudentCourseViewModel參數傳遞給post/create函數嗎?以及如何解決關係並保存? –

+0

我沒跟着你。也許,用你現有的代碼更新你的問題,幷包括你的行動的代碼。 –

+0

哦,我看到它不是那麼容易解釋,我現在用代碼更新了這個問題。我的問題是我不明白如何處理多對多的關係,並且我無法首先找到數據庫的好解釋,我首先找到了代碼。 –