【发布时间】:2019-09-07 02:13:49
【问题描述】:
Entity Framework 不尊重我的 Identity 列。它坚持尝试在我的 MS SQL DB 中的 Identity(自动增量)列中插入一个值,这显然是一个错误,因为 DB 应该提供该值。
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)
【问题讨论】:
-
EF Core 模型和数据库似乎是正确的。异常消息表明您的代码正在添加
Assignee并明确指定AssigneeId(0除外),在这种情况下,EF Core 尊重您的明确值(这是为了支持身份插入方案)。在调用Add方法之前确保AssigneeId为零。 -
您的身份列中缺少 DatabaseGeneratedOption.Identity 数据注释/流利的 API 配置。为什么它不是由脚手架创建的,我不知道。请注意,建议的显式 [Key] 注释不是必需的,尽管它应该可以工作,因为 PK 默认是标识列。
-
IDENTITY(-1, 1)(-1) 是错字吗?
标签: c# entity-framework tsql entity-framework-core auto-increment