2015-08-20 82 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

哦,我看到它不是那么容易解释,我现在用代码更新了这个问题。我的问题是我不明白如何处理多对多的关系,并且我无法首先找到数据库的好解释,我首先找到了代码。 –