使用Entity Framework保存部分数据(更新)

时间:2013-05-30 15:11:06

标签: c# asp.net entity-framework

所以我正在尝试对实体模型进行更新,但它并不像我想的那样好。我只是尝试更新模型中的一些字段,但是当我运行以下代码时,我得到一个SqlException抱怨有些字段(我不是要编辑)不允许空值。它似乎正在尝试在数据库中创建一个新行,而不仅仅是更新现有的行?不太清楚该怎么做。任何帮助将不胜感激。

[HttpPost]
public ActionResult Budget(Proposal proposal)
{
    if (ModelState.IsValid)
    {
        db.Proposals.Attach(proposal);
        db.ObjectStateManager.ChangeObjectState(proposal, EntityState.Modified);
        db.SaveChanges();
        return RedirectToAction("Details", new {id = proposal.ProposalID});
    }

    return View(proposal);
}

这是我得到的SqlException:“System.Data.SqlClient.SqlException:无法将值NULL插入列'Ulid',表'casurg2_dev2.dbo.Proposals';列不允许空值。更新失败。 声明已经终止。“

以下是有问题的观点:http://pastie.org/7984222

1 个答案:

答案 0 :(得分:1)

好的,来源并没有真正帮助那么多(顺便说一下 - 这就是SO,你可以在这里粘贴你的代码;不需要在其他地方粘贴它;)

我确实询问了Proposal实体的类定义......但是在它缺席的情况下我只能建议[猜测]你将Ulid的原始值作为隐藏字段放在你的ProposalId旁边像这样:

@Html.HiddenFor(model => model.ProposalID)  
@Html.HiddenFor(model => model.Ulid)

这样模型活页夹可以在帖子上正确地连接它。

我可以通过两种方式来思考所有隐藏的

  • 使用“添加控制器向导”将模板设置为EntityFramework - 然后修改相关的View代码。扔掉你不想要的东西等。

enter image description here

  • 更改Action方法以重新获取Proposal记录(使用其ProposalId),然后将更改的数据绑定到它。这不是我应该给出的一些建议(对数据库进行额外的,不必要的往返)

      [HttpPost]
      public ActionResult Budget(Proposal proposal)
      {
          if (ModelState.IsValid)
          {
              var proposalToMerge = db.Proposals.Find(proposal.ProposalId);
              UpdateModel(proposalToMerge);
              // don't need this anymore as entity instance is being tracked
              // db.Proposals.Attach(proposalToMerge );
              // db.ObjectStateManager.ChangeObjectState(proposalToMerge , EntityState.Modified);
              db.SaveChanges();
              return RedirectToAction("Details", new {id = proposal.ProposalID});
          }
    
          return View(proposal);
      }
    

或者总结那样。未经测试。