我有一个简单的模型记录,其中包含要添加到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了,也没有打算重新学习它。我希望我的旧代码可以继续工作。
答案 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
的异常,您可以:
Migrations
文件夹并清理项目dd-migration <migration_name>
和Update-database
创建新迁移。答案 1 :(得分:0)
您要在标识列的 Id 列中插入显式值。要将值明确插入身份列中,您必须打开身份插入。
如果数据库正在自动为 Id 列插入值,则不应在代码外部指定它们。
更新您的edmx文件,以反映您可能在数据库中进行的任何更改。如果数据库自动分配该值,则应该在设计器文件中的该属性下看到“ IsDbGenerated = true”属性。如果不存在,可以手动添加。