因此我们在edmx中有许多表,我们是从现有的sql数据库创建的。当我们尝试通过我们构建的UI向表中添加新条目时,除了4个之外的所有条目都会失败。
进行一些挖掘我们发现ModelState实际上返回为false,这是因为我们收到一条错误,指出“[PrimaryKeyId]字段是必需的”。当我们添加新数据时某些表工作正常时,我不明白会导致此问题的原因。
在edmx中,我们查看了表的主键的属性,一切似乎都正确
我觉得脚手架表时可能存在问题。我无法确定,我还在学习EF的错综复杂。
有人能指出我正确的方向吗?这可能是SQL方面的事情(有人不认为这是因为我们已经通过sql脚本在这些表中添加了数据)?它可能是EF吗?我应该再次吹掉edmx表并重新添加吗?我感到迷茫。谢谢你的帮助!
编辑1
因为我们使用了Entity Framework Scaffolding,所以我们有了基本的方法。这是创建方法,手动设置了一些属性。数据库中的主键也是自动递增。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Entity entity)
{
if (ModelState.IsValid)
{
_user = GetUser();
entity.CreateDate = DateTime.Now;
entity.LastUpdateDate = DateTime.Now;
entity.LastUpdatedById = _user.Id;
entity.CreatorId = _user.Id;
db.Entities.Add(entity);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(entity);
}
答案 0 :(得分:4)
问题已经解决了!
<强>要点:强> 经过一天的问题和解决方案的研究后,它变得非常简单。由于我们正在为sql数据库创建条目,因此我们将模型的属性公开给我们希望用户使用的视图。
我们遇到一个错误导致ModelState.IsValid为false。错误始终相同,“[PrimaryKeyId]字段是必需的”。
<强>解决方案:强> 在我们的视图(.cshtml)中,我们公开了主键属性,但将其标记为隐藏。显然,当您执行此操作时,EF执行的模型的验证/检查必须检查说明,如果属性在视图中公开,则根据需要标记它,并且由于它被隐藏而永远不会更新它获得默认int值为0,无效作为标识符。
这就是代码
<div class="bg-white content-inner">
@Html.HiddenFor(model => model.PrimaryKeyId)//BAD DO NOT DO THIS
<div class="row-fluid">
<div class="span4">
@Html.LabelFor(model => model.GroupName)
</div>
<div class="span4 offset2">
@Html.TextBoxFor(model => model.GroupName)
@Html.ValidationMessageFor(model => model.GroupName)
</div>
</div>
现在没有模型中的属性,我们得到了这个:
没有错误和有效的模型!
鉴于我仍然在学习EF和MVC,结果证明这是一次艰难的学习经历,但绝对是一个我不会再犯的错误。希望这可以帮助!
感谢所有人给了我建议和帮助。