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

时间:2018-03-19 19:15:19

标签: c# entity-framework asp.net-core .net-core ef-core-2.0

由于某些原因,我的.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团队提交了一张票,看起来他们已经确认这是一个问题。这是票证的链接。

Ticket

0 个答案:

没有答案