ASP.NET MVC:UpdateModel在尝试保存对集合的更改时失败 - 创建新对象而不是更新

时间:2011-07-10 20:41:45

标签: asp.net asp.net-mvc entity-framework

我有点发脾气。

基本上,我正在尝试为一组对象创建一个编辑 - 精确的EF对象。 我传递了一个包含Call类型对象的viewmodel。这是EF类型。一个电话有很多答案。在视图中,我遍历Answers并输出一个表单:

@using (Html.BeginForm())
    {

        foreach(var a in Model.Answers)
        {
            Html.RenderPartial("_AnswerForm", a);

        }
        <input type="submit" value="Save Answers" />
    }

部分视图如下:

@using (Html.BeginCollectionItem("Answers"))
{
    <div data-role="fieldcontain">
        @Html.HiddenFor(z => z.QuestionID)
        @Html.HiddenFor(z => z.CallID)
        @Html.LabelFor(x => x.OnEntryAnswer)
        @Html.CheckBoxFor(x => x.OnEntryAnswer)
        @Html.ValidationMessageFor(x => x.OnEntryAnswer)

        @Html.LabelFor(x => x.OnExitValue)
        @Html.TextBoxFor(x => x.OnExitValue)
        @Html.ValidationMessageFor(x => x.OnExitValue)

        @Html.HiddenFor(x => x.id)
    </div>
}

我的控制器动作看起来像......

 [HttpPost]
        public ActionResult FacingsAdjacency(FormCollection data)
        {
            Call activeCall = null;

            try { activeCall = this.GetCallInformation(); }
            catch (NoActiveCallException ex) { TempData["message"] = "No Call In Progress!"; RedirectToAction("NoCallInProgress"); }
            QuestionFormViewModel vm = new QuestionFormViewModel(activeCall, "FacingsAdjacency");


            UpdateModel(activeCall.CallAnswers, "Answers");
            callRepository.Save();


            return View(vm);
        }

调用Save(在上下文中调用savechanged)时会抛出错误:

  

由于一个或多个外键属性,无法更改关系   是不可空的

如果我检查datacontext正在跟踪的项目,我发现它的数量应该是应有的两倍。有三个要修改(正确),三个具有完全相同的细节,标记为已添加。所有数据都来自POST以填充EF对象 - 我只是不确定它为什么失败。

由于

3 个答案:

答案 0 :(得分:1)

我发现在管理对象引用并将它们保存回数据库时,EF可能会有点麻烦。

我建议您在调用callRepository.Save()之前“清除”Answers以删除引用的对象(只需将属性设置为null),只需保留ID字段。

答案 1 :(得分:1)

这很奇怪。如果有人能够解释这一点,我很乐意听到它!

基本上我通过从我的答案表中删除自动递增主键并使用复合键来解决问题。 灵感来自这篇文章: Updating a list of foreign keys in EF4, using MVC 2 Repository Viewmodel Pattern

我不知道为什么使用单个主键而不是复合词会搞砸。

答案 2 :(得分:0)

在更新方法的存储库中尝试

_dbSet.Attach(entity);
_dbContext.Entry(entity).State = System.Data.EntityState.Modified;
_dbContext.SaveChanges();