0

我得到这个奇怪的“错误”。当我运行我的应用程序(编辑操作,即更新)时,我得到了存储在我的 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> }
4

2 回答 2

0

它可能在调试器中工作,因为通过在属性监视窗口中检查集合,由于集合的延迟加载course.Students您实际上触发了第二个数据库查询(在加载 的查询之后course)。(您的集合很可能被声明为。)如果您在没有调试器的情况下运行,则不会发生延迟加载并保持为空。StudentsCourse.Studentsvirtualcourse.Students

您可以通过使用急切加载而不是延迟加载来强制course.Students始终加载集合(这也节省了第二次数据库往返):

var course = db.Courses
    .Include(c => c.Students)
    .Where(c => c.Id == model.CourseId)
    .Single();

老实说,我不知道为什么您的代码可以与加载的集合(在调试器中)一起正常工作,以及为什么它完全可以工作。像这样分配一个完整的分离集合:course.Students = model.Students,然后仅将父集合的状态设置Modified为通常不足以更新子集合。

但我"ValueInjecter"在你的截图中看到了。也许有一些自动映射魔法正在发生(意外地?)正确的事情来获得工作更新。

于 2013-02-13T21:10:39.247 回答
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);
    }

仍然使用上面粘贴的视图。

于 2013-02-14T16:12:54.953 回答