gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:57 25 4
gpt4 key购买 nike

我无法更新多对多关系。当我调试“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com