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

C# 在sql表中创建新条目时需要主键的EF,c#,mysql,sql,sql-server,entity-framework,C#,Mysql,Sql,Sql Server,Entity Framework,因此,我们的edmx中有许多表,13,是从现有的sql数据库创建的。当我们试图通过我们构建的UI向表中添加一个新条目时,除了4个之外,其他所有条目都失败了 通过一些挖掘,我们发现ModelState实际上返回为false,这是因为我们得到一个错误,该错误声明“需要[PrimaryKeyId]字段”。我不明白当我们添加新数据时,某些表工作正常时,是什么导致了这个问题 在edmx中,我们查看了表主键的属性,似乎一切都正常 我觉得在搭建桌子时可能会有问题。我不能确定,我仍在学习EF的复杂性 谁能给

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

通过一些挖掘,我们发现ModelState实际上返回为false,这是因为我们得到一个错误,该错误声明“需要[PrimaryKeyId]字段”。我不明白当我们添加新数据时,某些表工作正常时,是什么导致了这个问题

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

我觉得在搭建桌子时可能会有问题。我不能确定,我仍在学习EF的复杂性

谁能给我指出正确的方向吗?这可能是SQL方面的问题吗(我个人不这么认为,因为我们已经通过SQL脚本在这些表中添加了数据)?可能是EF吗?我是否应该再次吹扫edmx表并重新添加它们?我感到迷路了。谢谢你的帮助

编辑1

因为我们使用了实体框架脚手架,所以我们有了基本的方法。这是一个create方法,手动设置了一些属性。数据库中的主键也是自动递增的

[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);
}

问题解决了

摘要: 经过一天的问题和研究,终于找到了一个非常简单的解决办法。因为我们正在创建sql数据库的条目,所以我们将模型的属性公开给我们期望用户使用的视图

我们收到一个错误,导致ModelState.IsValid为false。错误总是相同的,“[PrimaryKeyId]字段是必需的”

解决方案: 在视图(.cshtml)中,我们公开了主键属性,但将其标记为隐藏。显然,当您执行此操作时,EF所执行的模型的验证/检查必须进行检查,大意是,如果属性在视图中公开,请将其标记为必需,并且由于该属性被隐藏而从未更新,因此它会在0上获取默认的int值,该值作为标识符无效

代码就是这样的

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

@Html.HiddenFor(model=>model.PrimaryKeyId)//不好,不要这样做
@LabelFor(model=>model.GroupName)
@Html.TextBoxFor(model=>model.GroupName)
@Html.ValidationMessageFor(model=>model.GroupName)
现在,如果没有模型中的属性,我们可以得到:

没有错误和有效的MODELSTATE!

鉴于我仍在学习EF和MVC,这是一次艰难的学习经历,但我肯定不会再犯错误。希望这能有所帮助


感谢大家给我的建议和帮助。

问题已经解决了

摘要: 经过一天的问题和研究,终于找到了一个非常简单的解决办法。因为我们正在创建sql数据库的条目,所以我们将模型的属性公开给我们期望用户使用的视图

我们收到一个错误,导致ModelState.IsValid为false。错误总是相同的,“[PrimaryKeyId]字段是必需的”

解决方案: 在视图(.cshtml)中,我们公开了主键属性,但将其标记为隐藏。显然,当您执行此操作时,EF所执行的模型的验证/检查必须进行检查,大意是,如果属性在视图中公开,请将其标记为必需,并且由于该属性被隐藏而从未更新,因此它会在0上获取默认的int值,该值作为标识符无效

代码就是这样的

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

@Html.HiddenFor(model=>model.PrimaryKeyId)//不好,不要这样做
@LabelFor(model=>model.GroupName)
@Html.TextBoxFor(model=>model.GroupName)
@Html.ValidationMessageFor(model=>model.GroupName)
现在,如果没有模型中的属性,我们可以得到:

没有错误和有效的MODELSTATE!

鉴于我仍在学习EF和MVC,这是一次艰难的学习经历,但我肯定不会再犯错误。希望这能有所帮助


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

您检查过主键是否为自动递增列了吗?请发布一个示例代码,说明您在何处为其中一个表创建条目,这给您带来了一个问题显示失败的SQL表设计,它有主键吗?在使用EDMX时,出现这样的问题是很常见的。只要SQL中的表在设计上是正确的,只需尝试从edmx模型中删除有问题的表,然后重新添加它。所有表都有主键,从edmx中删除并不能解决问题。虽然我通常使用@Derek seuggestion,但98%的时间都能正常工作。遗憾的是,它没有完成这项工作。我会继续做一些研究。是否还有其他人有此问题?是否检查了主键是否为自动增量列?发布一个示例代码,说明您在何处为其中一个表创建条目,这会给您带来问题。显示SQL表设计失败时,是否有主键?在使用EDMX时,出现这样的问题很常见。只要SQL中的表在设计上是正确的,只需尝试从edmx模型中删除有问题的表,然后重新添加它。所有表都有主键,从edmx中删除并不能解决问题。虽然我通常使用@Derek seuggestion,但98%的时间都能正常工作。遗憾的是,它没有完成这项工作。我会继续做一些研究。还有其他人有这个问题吗?我也有同样的问题。然而,我想知道你的问题的正确解决方法。怎么了?我正在吃