【问题标题】:MVC EF Database first many to manyMVC EF 数据库首先是多对多
【发布时间】:2015-11-14 00:38:36
【问题描述】:

有人可以先说明 EF 数据库中有多少关系有效吗? 例如StudentCourse 表,其中的关系是多对多的。我已经有一个数据库。

所以我创建了一个.edmx

StudentCourses 的类是自动创建的。我在StudentCourseViewModel.cs 中添加了一个新类。想法是控制与它的关系。 我的StudentCourseViewModel 包含以下内容:

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 中的课程列表? 上面的代码出现以下错误:

EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的异常,但未在用户代码中处理

附加信息:更新条目时出错。有关详细信息,请参阅内部异常。

【问题讨论】:

  • 关系在数据库中是如何映射的,有没有中间StudentCourse映射表?目前尚不清楚您的“ViewModel”如何以任何方式映射关系。
  • 嘿,我在数据库中有一个中间 StudentCourse 表,但是当我创建 .edmx 时,StudentCourse 表未显示在模型中,它是一个链接,其中包含“多对多” *" 符号。
  • 听起来它已经正确映射了,你没有为你的中间表生成一个类,只是填充了相关的导航属性。您的控制器/视图中有什么问题?
  • 我在创建新学生时用其他词更新学生时遇到问题。我已将以下内容添加到 Get /create function ViewBag.Courses= new SelectList(db.Courses, "pkID", "Name");它的工作原理我在创建视图中有一个列表,我可以选择,这里是如何修改 Post/Create 函数以正确保存它的问题?

标签: c# asp.net-mvc entity-framework


【解决方案1】:

保存多对多关系可能有点棘手,如果您不小心,EF 可能会感到困惑,并认为您正在尝试读取现有项目并给您带来完整性错误。

您已经在使用具有包含整数列表的属性的视图模型。那挺好的。战斗胜利了一半。现在,您只需要一些逻辑来查询所选课程并将它们添加到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));

由于您正在创建一个全新的学生,因此无需担心现有的关系。

【讨论】:

  • 谢谢你,Chris,我已将 ViewBag.Courses= new SelectList(db.Courses, "pkID", "Name"); 添加到 get/create 函数中,它提供了一个课程列表以供在创建视图中选择。现在当我选择一门课程并输入创建时,我在db.SaveChanges(); 行出现错误,那是因为获取的数据与数据库不匹配,所以我不知道如何解决是如何解决这个问题,我应该通过一个发布/创建函数的 StudentCourseViewModel 参数?以及如何修复关系并保存?
  • 我没有关注你。或许,用您现有的代码更新您的问题,并包含您的操作代码。
  • 哦,我知道这不是那么容易解释,我现在已经用代码更新了这个问题。我的问题是我不明白如何处理多对多关系,我找不到一个很好的数据库解释,我首先找到了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多