Entity Framework Core 不尊重 Identity 列

Fiz*_*zzy 6 c# t-sql entity-framework auto-increment entity-framework-core

实体框架不尊重我的Identity专栏。它坚持尝试将一个值插入到Identity我的 MS SQL DB 中的(自动增量)列中,这显然是一个错误,因为数据库应该提供该值。

System.Data.SqlClient.SqlException: 'Cannot insert explicit value for identity column in table 'Assignee' when IDENTITY_INSERT is set to OFF.'
Run Code Online (Sandbox Code Playgroud)

它为什么要这么做?我将其与涉及一个表和一列的模式配对:

CREATE TABLE [dbo].[Assignee](
  [AssigneeID] INT IDENTITY(-1, 1) NOT NULL
CONSTRAINT [Assignee$PrimaryKey] PRIMARY KEY CLUSTERED 
( [AssigneeID] ASC ))
Run Code Online (Sandbox Code Playgroud)

将此模式发布到本地数据库后,我用它Scaffold-DbContext来生成实体和上下文类。生成的Assignee类仅包含此公共属性。

public int AssigneeId { get; set; }
Run Code Online (Sandbox Code Playgroud)

上下文仅指Assignee此处:

modelBuilder.Entity<Assignee>(entity =>
{
  entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID");
});
Run Code Online (Sandbox Code Playgroud)

四处搜索,我看到人们声称要让 EF 尊重 Identity 列,上下文应该使用ValueGeneratedOnAdd(). 换句话说,上下文类中的行应为:

entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID")
  .ValueGeneratedOnAdd();
Run Code Online (Sandbox Code Playgroud)

我对此有两个问题:

  1. 我从现有的数据库开始并生成实体类。如果我需要ValueGeneratedOnAdd()那么为什么不Scaffold-DbContext生成它?
  2. 即使我手动编辑生成的上下文类并添加ValueGeneratedOnAdd()仍然无法正常工作,并出现相同的错误。

在其他地方我看到使用的建议UseSqlServerIdentityColumn()。这对我来说也不起作用。第 1 点和第 2 点仍然适用。

任何帮助将不胜感激。请不要建议我使用,IDENTITY_INSERT因为这会破坏使用自动增量列的全部意义。

(我使用的是 Entity Framework Core 2.2.3 和 Microsoft SQL Server 14)

g.p*_*dou 2

简洁版本

我们在这里得到并经历了不同的结果,其中一个可以重现该问题,而其他则不能。根据我的经验,这取决于 Id 属性的值是否为 0。

详细版本

根据我的经验,默认行为(基于名称约定)肯定有效,因此,如果您将数据库实体的属性(C# 属性)命名为 Id 或 EntityNameId,它应该有效。没有 C# 实体类属性,也不需要 OnModelCreating 配置。同时,如果问题不存在,则 No C# 实体类属性和 OnModelCreating 配置都不会修复它。

...因为如果Id 属性的值不为 0,生成的 SQL 将包含显式字段名称和值,因此我们收到错误。这显然是 EF core 中的问题,但解决方法很简单。