由于某些原因,我的.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,非空
ID_AUTO - smallint,not null,标识列
插入新记录时,出现以下错误。
DbUpdateConcurrencyException:数据库操作预计会影响1 行但实际上影响了0行。数据可能已被修改或 自实体加载后删除
当我使用Entity Framework(不是核心)时,我能够通过在AFTER INSERT触发器的末尾添加以下代码行来解决这个问题。
SELECT CAST(SCOPE_IDENTITY() AS varchar) AS ID
但是当我将我的应用程序转换为.net core(ef core)时,该行代码导致了另一个错误,如下所示。
InvalidOperationException:数据库为其生成了null值 实体类型“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 Core会忽略SCOPE_IDENTITY并只使用用于插入记录的ID值来进行查询。
任何帮助?
更新
我向EF Core团队提交了一张票,看起来他们已经确认这是一个问题。这是票证的链接。