在运行时MVC4实体框架上重复

时间:2013-02-13 10:13:11

标签: asp.net-mvc-4 many-to-many entity-framework-5 updates

我得到了这个奇怪的“错误”。当我运行我的应用程序(编辑操作,即更新)时,我得到存储在我的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。都好。   My view Model that i get back

我的旧值来自dB。我想更新这些数据。所以一切都还不错......

enter image description here

我的旧值已更新为我的新值。太好了!

enter image description here


如果我像这样使用调试器,那么一切都很好。但是,如果我运行应用程序,我会得到重复......任何人?

新内容:

我的编辑视图

  

@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> }

2 个答案:

答案 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);
    }

仍然使用已粘贴上方的视图。