实体框架无法正确识别我的Identity
列,它坚持尝试向我的 MS SQL 数据库中的一个 Identity
(自动增量)列插入一个值,这显然是一个错误,因为数据库应该提供这个值。
System.Data.SqlClient.SqlException: 'Cannot insert explicit value for identity column in table 'Assignee' when IDENTITY_INSERT is set to OFF.'
为什么它要这样做?我已经简化成一个涉及一个表和一列的模式:
CREATE TABLE [dbo].[Assignee](
[AssigneeID] INT IDENTITY(-1, 1) NOT NULL
CONSTRAINT [Assignee$PrimaryKey] PRIMARY KEY CLUSTERED
( [AssigneeID] ASC ))
将该模式发布到本地数据库后,我使用Scaffold-DbContext
生成实体和上下文类。生成的Assignee
类仅包含此公共属性。
public int AssigneeId { get; set; }
这里的上下文只涉及到Assignee
:
modelBuilder.Entity<Assignee>(entity =>
{
entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID");
});
在搜索过程中,我看到有人声称为了使E.F.尊重标识列,上下文应该使用
ValueGeneratedOnAdd()
对属性进行配置。换句话说,在上下文类中的代码行应该是:entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID")
.ValueGeneratedOnAdd();
我对此有两个问题:
- 我正在使用现有的数据库并生成实体类。如果我需要
ValueGeneratedOnAdd()
,那么为什么Scaffold-DbContext
不能生成它? - 即使我手动编辑生成的上下文类并添加
ValueGeneratedOnAdd()
,它仍然无法与相同的错误一起工作。
在其他地方,我看到建议使用UseSqlServerIdentityColumn()
。但对我来说也不管用。第1点和第2点仍然适用。
非常感谢您提供的帮助。请不要建议我使用IDENTITY_INSERT
,因为那样会破坏使用自动递增列的整个目的。
(我正在使用Entity Framework Core 2.2.3和Microsoft SQL Server 14)
AssigneeId
(而不是0
)的Assignee
,在这种情况下,EF Core 将尊重您的显式值(这是为了支持标识插入场景)。在调用Add
方法之前,请确保AssigneeId
为零。 - Ivan StoevIDENTITY(-1, 1)
(-1) 是一个打字错误吗? - Gert Arnold