所以我正在尝试对实体模型进行更新,但它并不像我想的那样好。我只是尝试更新模型中的一些字段,但是当我运行以下代码时,我得到一个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
答案 0 :(得分:1)
好的,来源并没有真正帮助那么多(顺便说一下 - 这就是SO,你可以在这里粘贴你的代码;不需要在其他地方粘贴它;)
我确实询问了Proposal实体的类定义......但是在它缺席的情况下我只能建议[猜测]你将Ulid的原始值作为隐藏字段放在你的ProposalId
旁边像这样:
@Html.HiddenFor(model => model.ProposalID)
@Html.HiddenFor(model => model.Ulid)
这样模型活页夹可以在帖子上正确地连接它。
我可以通过两种方式来思考所有隐藏的
更改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);
}
或者总结那样。未经测试。