c# - ASP.net MVC Entity Framework 更新多对多关系

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

我无法更新多对多关系。当我调试“Response.Write(teacher.skills);”时,值似乎正确但数据库没有更新对象。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "id,lastname,firstname,image,campusId,skillIds")] Teacher teacher)
{
    if (ModelState.IsValid)
    {
        if (teacher.skillIds != null)
        {
            teacher.skills = (from t in db.Skills.ToList() where teacher.skillIds.Contains(t.id) select t).ToList();
        }

        Response.Write(teacher.skills);

        // 1st attempt -->
        //db.Teachers.Attach(teacher);
        //db.Entry(teacher).State = EntityState.Modified;

        // 2nd attempt -->
        UpdateModel(teacher);


        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(teacher);
}

最佳答案

不要清除技能。这实际上是告诉 Entity Framework 从连接表中删除所有现有关系,然后重新添加全新的关系。

更新 M2M 关系时,不能只设置属性。您需要先删除所有取消选择的项目,然后添加新项目,同时保留现有项目:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int id, TeacherViewModel model)
{
    var teacher = db.Teachers.Find(id);
    if (teacher == null)
    {
        return new HttpNotFoundResult();
    }

    if (ModelState.IsValid)
    {
        teacher.firstname = model.lastname;
        teacher.lastname = model.lastname;
        teacher.image = model.image;
        teacher.campusId = model.campusId;

        // Remove deselected skills
        teacher.skills.Where(m => !model.skillIds.Contains(m.Id))
            .ToList().ForEach(skill => teacher.skills.Remove(skill));

        // Add new skills
        var existingSkillIds = teacher.skills.Select(m => m.Id);
        db.Skills.Where(m => model.skillIds.Exclude(existingSkillIds).Contains(m.Id))
            .ToList().ForEach(skill => teacher.skills.Add(skill));

        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(model);
}

如您所见,我已经添加了一个 View 模型,您应该随时在需要添加 Bind 时使用它。永远不要使用 Bind。我还将教学 ID 作为 URL 的一部分传递。你永远不应该发布 id。切勿在您的帖子正文中包含任何您不希望被潜在修改的内容。我使用该 ID 从数据库中选择新的老师。您永远不应该直接保存已发布的实体。然后是删除取消选择的技能并添加新选择的技能的新代码。

关于c# - ASP.net MVC Entity Framework 更新多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34414355/

相关文章:

c# - 如何在 Visual Studio 2015 中获取部分类型的所有部分定义?

c# - Thinktecture Identity Server v3 如何防止来自外部提供商的声明?

c# - 像谷歌地方一样切换按钮

c# - MVC Action 中神秘的长度参数

c# - 没有 Entity Framework DbContext 的 OWIN 配置

c# - cocoaasynsocket到C Sharp服务器

c# - 如何通过在我的 Asp.net MVC 项目中发布特定的 Url 来检查网站内容是否抄袭?

javascript - 使用 JQuery $.get 调用服务器端 onclick

javascript - 如何从 JS 文件读取(MVC 3、Razor)模型值?

asp.net-mvc - 日期时间的数据格式字符串