我得到了这个奇怪的“错误”。当我运行我的应用程序(编辑操作,即更新)时,我得到存储在我的dB中的重复值。如果我使用调试器,一步一步,它的工作(没有重复)......
这是一个多对多的关系所以不要打扰图像中的Courses NULL值,只是想弄清楚...
感谢所有帮助!
[HttpPost] public ActionResult Edit(CourseStudentViewModel model) { var course = db.Courses .Where(c => c.Id == model.CourseId) .Single(); if (ModelState.IsValid) { course.Name = model.CourseName; course.Description = model.CourseDescription; course.Students = model.Students; if(course.Id != 0) { db.Entry(course).State = System.Data.EntityState.Modified; } else { db.Courses.Add(course); } db.SaveChanges(); return RedirectToAction("Index"); } //modelstate not valid, display form return View(model); }
我得到了我的viewModel。都好。
我的旧值来自dB。我想更新这些数据。所以一切都还不错......
我的旧值已更新为我的新值。太好了!
如果我像这样使用调试器,那么一切都很好。但是,如果我运行应用程序,我会得到重复......任何人?
新内容:
我的编辑视图
@model ValueInjecter.Web.Models.CourseStudentViewModel
@ { ViewBag.Title =“编辑”; }
编辑课程
@using(Html.BeginForm()){ @ Html.HiddenFor(c => Model.CourseId) @ Html.LabelFor(c => Model.CourseName) @ Html.EditorFor(c => Model.CourseName)
@Html.LabelFor(c => Model.CourseDescription) @Html.EditorFor(c => Model.CourseDescription) </div> <hr /> <h2>Students</h2> <div class="editor-field"> @for (int i = 0; i < Model.Students.Count(); i++) { <div style="border: dotted 1px; padding: 5px; margin: 10px;"> @Html.HiddenFor(s => s.Students[i].Id) @Html.LabelFor(s => s.Students[i].Name[i + 1]) @Html.EditorFor(s => s.Students[i].Name) </div> } </div> <p> Number of Students: <b>@Html.DisplayFor(s => Model.StudentCount)</b> </p> <hr /> <p> <input type="submit" value="Save" /> </p> }
答案 0 :(得分:0)
它可能在调试器中有效,因为通过在属性监视窗口中检查course.Students
集合,实际上会触发由于延迟加载而导致第二次数据库查询(在加载course
的查询之后) <{1}}集合的。 (您的Students
集合很可能被声明为Course.Students
。)如果您在没有调试器的情况下运行,则不会发生延迟加载并且virtual
保持为空。
您可以使用 eager loading 而不是延迟加载(这也会保存第二个数据库往返)强制始终加载course.Students
集合:
course.Students
老实说,我不知道为什么你的代码与加载的集合(在调试器中)正常工作以及为什么它可以正常工作。像这样分配一个完整的分离集合:var course = db.Courses
.Include(c => c.Students)
.Where(c => c.Id == model.CourseId)
.Single();
,然后只需将父状态设置为course.Students = model.Students
通常不足以更新子集合。
但我在屏幕截图中看到Modified
。也许有一些自动映射魔法发生(意外地?)正确的事情来获得工作更新。
答案 1 :(得分:0)
好的,我终于找到了解决问题的方法。当然比最初的想法容易得多。
[HttpPost]
public ActionResult Edit(CourseStudentViewModel model) { if (ModelState.IsValid) { var course = db.Courses.Find(model.CourseId); course.Name = model.CourseName; course.Description = model.CourseDescription; if(model.Students != null) { foreach (var item in model.Students) { db.Entry(item).State = System.Data.EntityState.Modified; } } if(course.Id != 0) { db.Entry(course).State = System.Data.EntityState.Modified; } else { db.Courses.Add(course); } db.SaveChanges(); return RedirectToAction("Index"); } //modelstate not valid, display form return View(model); }
仍然使用已粘贴上方的视图。