插入记录和分配主键EF Core 3.0的问题

时间:2019-11-02 03:21:42

标签: asp.net-core entity-framework-core

我有一个简单的模型记录,其中包含要添加到EF实体的键“ Id”。它通过Core 2.1正常运行,但现在失败并显示以下错误:

SqlException: Cannot insert explicit value for identity column in table 'SpeakerRecs' when IDENTITY_INSERT is set to OFF.

模型定义如下:

namespace WebAppCore.Models
{
    public class SpeakerRec
    {
        [Key]
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string ImageUrl { get; set; }
    }
}

执行插入操作的代码是这个,并且在保存更改调用时失败。

        foreach (var speaker in speakerRecs)
        {
            _context.SpeakerRecs.Add(speaker);
        }
        _context.SaveChanges();

我看到有关在Core 3中进行重大更改的说明,并且问题以某种方式ValueGeneratedNever()周围出现,但无法解决。我已经有一段时间没有使用EF了,也没有打算重新学习它。我希望我的旧代码可以继续工作。

2 个答案:

答案 0 :(得分:1)

如果要手动插入Id,可以使用[DatabaseGenerated(DatabaseGeneratedOption.None)]None选项可防止数据库在其他情况下会自动创建值的情况:

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

如果您之前创建过迁移,则在创建新迁移和更新数据库时,可能会遇到类似To change the IDENTITY property of a column, the column needs to be dropped and recreated的异常,您可以:

  1. 删除实际数据库
  2. 删除项目中的Migrations文件夹并清理项目
  3. 在软件包管理器控制台中依次使用dd-migration <migration_name>Update-database创建新迁移。

答案 1 :(得分:0)

您要在标识列的 Id 列中插入显式值。要将值明确插入身份列中,您必须打开身份插入

如果数据库正在自动为 Id 列插入值,则不应在代码外部指定它们。

更新您的edmx文件,以反映您可能在数据库中进行的任何更改。如果数据库自动分配该值,则应该在设计器文件中的该属性下看到“ IsDbGenerated = true”属性。如果不存在,可以手动添加。

Reference