0

所以我正在尝试对实体模型进行更新,但它并没有我想要的那么好。我只是想更新我的模型中的几个字段,但是当我运行以下代码时,我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

4

1 回答 1

1

好的,源代码并没有那么大的帮助(顺便说一句 - 就是这样,您可以将代码粘贴到此处;无需将其粘贴到其他地方;)

我确实也要求提供 Proposal 实体的类定义......但在它缺席的情况下,我只能建议 [猜测] 你将 Ulid 的原始值作为隐藏字段与你的ProposalId类似:

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

以便模型活页夹可以将其正确连接到柱子上。

我可以想到两种方法来绕过所有隐藏的努力

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

在此处输入图像描述

  • 更改 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);
      }
    

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

于 2013-05-30T15:59:53.273 回答