EF在sql表中创建新条目时需要主键

时间:2013-11-27 15:22:53

标签: c# mysql sql sql-server entity-framework

因此我们在edmx中有许多表,我们是从现有的sql数据库创建的。当我们尝试通过我们构建的UI向表中添加新条目时,除了4个之外的所有条目都会失败。

进行一些挖掘我们发现ModelState实际上返回为false,这是因为我们收到一条错误,指出“[PrimaryKeyId]字段是必需的”。当我们添加新数据时某些表工作正常时,我不明白会导致此问题的原因。

enter image description here

在edmx中,我们查看了表的主键的属性,一切似乎都正确

enter image description here

我觉得脚手架表时可能存在问题。我无法确定,我还在学习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);
}

1 个答案:

答案 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>

现在没有模型中的属性,我们得到了这个:

没有错误和有效的模型! NO ERRORS

VALID MODEL STATE

鉴于我仍然在学习EF和MVC,结果证明这是一次艰难的学习经历,但绝对是一个我不会再犯的错误。希望这可以帮助!

感谢所有人给了我建议和帮助。