【问题标题】:Why is the id of my model in create method always null and invalid?为什么我的模型在 create 方法中的 id 总是为空且无效?
【发布时间】:2016-08-06 16:44:38
【问题描述】:

好的,所以这个问题在 SO 上似乎有很多不同的答案 - 但我找不到可以解决我的问题或让我清楚问题所在的副本。当我尝试插入/创建时出现问题,并且是 db.SaveChanges() 上的验证错误。首先,我在调试器中得到了一个正在验证的“模型必须有一个 id”消息。当然,首先我的 id 是一个字符串,读完之后我发现它没有意义。How to generate and auto increment Id with Entity Framework 然后,我根据上面的链接解决方案将我的 id 更改为 int 并删除了 [Key] 数据注释。我还更新了数据库。但是,id 现在显示为 0,并且我收到一个验证错误,提示“无法将值 NULL 插入到列 id 中...” 但是,如果我对 id 进行硬编码,则表会更新得很好。这是代码..任何帮助表示赞赏。 型号:

    public class Model
{
    //[Key]
    //[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ModelId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    [DataType(DataType.Time)]
    public DateTime OpenTime { get; set; }

    [Required]
    [DataType(DataType.Time)]
    public DateTime CloseTime { get; set; }

    //Navigation property
    public virtual ICollection<OtherModel> OtherModels { get; set; }
}

控制器:

    // GET: Model/Create
    public ActionResult Create()
    {
        return View();
    }

    // POST: Model/Create
    [HttpPost]
    public ActionResult Create(Model model)
    {
        try
        {
            db.Models.Add(model);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(model);
        }
    }

【问题讨论】:

  • 你确实需要那些你已经注释掉的属性。
  • 你在使用 SQL Server 吗?
  • 您的数据库中的 Id 字段的名称是什么?如果它与您的模型不同,您如何映射它?
  • 两者都匹配.. 例如 ModelId => ModelId
  • 为什么要删除DatabaseGenerated 属性?我认为您在没有标识规范的情况下在数据库中添加了 Id 列。它甚至是主键吗?我想你在那里有一些工作要做。更改主键需要删除表并重新创建。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您只需取消注释包含DatabaseGenerated(DatabaseGeneratedOption.Identity)] 的行。之后,实体框架将自动为您增加 id。或者,如果您想自定义 id 并且不希望实体框架为您生成它,在这种情况下,您可以将 DatabaseGenerated(DatabaseGeneratedOption.Identity)] 替换为 DatabaseGenerated(DatabaseGeneratedOption.None)]

【讨论】:

  • Ef 不会生成/增加键值。注释仅用于让 EF 知道数据库执行此操作。但是,我认为这不会发生在这里。
  • 所以,重建解决方案并尝试了这个,但仍然得到 NULL 异常。我必须先更新数据库吗?它说列不允许空值,但我不认为它是整数? id 是一个解决方案吧?
  • 您是否在应用程序中首先使用代码?然后尝试通过迁移更新您的数据库。要在您的应用程序中启用迁移,您只需在包管理器控制台中执行 enable-migrations....
  • 好的,让我概括一下所有内容.... 第一步:取消注释 DatabaseGenerated(DatabaseGeneratedOption.Identity)] 第二步:启用迁移是一个必须执行才能启用迁移的命令。第 3 步:add-migration name_of_the_migration 是一个命令,它将生成一个包含所有修改的类 第 4 步:最后应该执行 update-database 命令来更新您的数据库。如果您已正确完成所有步骤。通常你的代码应该可以完美运行。
【解决方案2】:

如果您使用 SQL Server,您的 ModelId 必须是数据库中的标识。

每个实体必须至少有一个键。

【讨论】:

  • 我在这里可能是错的,但我认为 Entity Framework 会在您第一次运行代码时为您处理密钥创建。它会查找其中包含 Id 的属性并将其设置为键...我认为.. 也许其他人肯定知道。
【解决方案3】:

如下所示更新您的ModelId 属性并使用Package Manager Console 应用迁移。

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ModelId { get; set; }

如果问题仍未解决,请在设计模式下使用SSMS(Sql Server Management Studio)打开相关表。然后检查ModelId 是否似乎是PK 并且Is Identity 属性设置为“是”,如下面的屏幕截图所示。希望这会有所帮助...

【讨论】:

  • 好的,它成功了……一次!我想我需要将 .None 改回 .Identity?出现 PK 违规错误 - 无法插入重复项
  • 可能是PK值与相关表的FK值不兼容造成的。请检查相关表中是否存在不兼容的值对。
  • 好的。所以我检查了连接表中的外键,发现我之前更改时忘记将其更改为 int。认为这将是问题,但仍然出现重复错误。
  • @Inkers 请您完整备份您的数据库,然后删除-创建可能导致问题的表中的数据。我认为你的问题已经解决了,但是在导致错误之前添加了数据。
【解决方案4】:

我在这方面走错了方向,所以很多 cmets,虽然在某些方面有用,但对其他人来说可能有点误导。 问题:正如 Gert Arnold 和 Ramn Singh 所暗示的,我首先创建了我的表,但没有身份:true 这意味着

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //你需要在你的模型中包含这个

在创建表之后包含它时,我什么也没做。即使对数据库进行更新并删除并重新创建数据库,id 也不能为空错误仍然存​​在。 然后我遇到了这个:Reset Entity-Framework Migrations

  1. 转到解决方案资源管理器,迁移,右键单击,删除。
  2. 进入 Sql Server 对象资源管理器,迁移历史,右键删除,等待脚本生成并运行。
  3. 打开包管理器控制台(工具 - NuGet 包管理器 - 包管理器控制台)
  4. 键入 Enable-Migrations -Force
  5. 添加迁移初始
  6. 更新数据库

对于某些人来说,这会引发“表 x 已存在”异常。上面的链接提到注释掉迁移的“向上”部分。当我尝试这个时,我的项目将无法构建。 因为我的数据不重要/测试,我又回到了

  1. Sql Server 对象资源管理器,选择所有表(不是系统),右键,删除。
  2. 返回 PM 控制台
  3. 更新数据库

运行您的项目并与 db 交互。希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多