插入由AFTER INSERT触发器设置的主键记录时出错

出于某种原因,我的.Net Core项目中很少有SQL表具有由插入后触发器设置的主键列(varchar)值。 看下面的触发器。

USE [MyDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Lookup].[MyTable_Insert] ON [Lookup].[MyTable] AFTER INSERT        
AS
SET NOCOUNT ON
UPDATE Lookup.MyTable
SET ID = convert(varchar,ID_AUTO)

ID - 主键,varchar,不为null

ID_AUTO - smallint,非空,标识列

插入新记录时,出现以下错误。

DbUpdateConcurrencyException:数据库操作预计会影响1行,但实际上影响0行。 自实体加载后,数据可能已被修改或删除

当我使用Entity Framework(不是核心)时,我可以通过在AFTER INSERT触发器的末尾添加以下代码行来解决该问题。

SELECT CAST(SCOPE_IDENTITY() AS varchar) AS ID

但是,当我将我的应用程序转换为.net核心(ef核心)时,该行代码会导致另一个错误,如下所示。

InvalidOperationException:数据库为实体类型“MyTable”的非空属性“IdAuto”生成一个空值。 确保数据库中的值生成配置与模型中的配置相匹配。

看一下SQL分析器,下面是我可以看到的SQL语句。

exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Lookup].[MyTable] ([ID], [Active])
VALUES (@p0, @p1);
SELECT [ID_AUTO]
FROM [Lookup].[MyTable]
WHERE @@ROWCOUNT = 1 AND [ID] = @p0;

',N'@p0 varchar(5),@p1 varchar(3),@p0='9999',@p1='Y'

所以我认为EF核心忽略了SCOPE_IDENTITY,并使用用于插入记录的ID值来查询它。

任何帮助?

更新:

我向EF核心团队提交了一张票,看起来他们已经确认这是一个问题。 这是链接到票。


我向EF Core团队提交了一张票。 他们表示他们不支持这些功能,最好的做法是将ID_AUTO列作为主键。 这就是我最终做的。

链接地址: http://www.djcxy.com/p/60289.html

上一篇: Error while inserting record whose primary key set by AFTER INSERT trigger

下一篇: Display Data from Database to Label