EF Core调用SaveChanges遇多余结果集警告,如何解决?
问题描述
我在[dbo].[Customers]表上创建了一个INSTEAD OF INSERT触发器,用于自定义插入并返回Id,触发器代码如下:
CREATE TRIGGER [dbo].[ReferenceTrigger] ON [dbo].[Customers] INSTEAD OF INSERT AS BEGIN DECLARE @reference varchar(6); --And set INSERT INTO Customers OUTPUT inserted.Id SELECT --Here the original fields... Reference = @string FROM inserted; SELECT Id FROM Customers WHERE @@ROWCOUNT > 0 AND Id = SCOPE_IDENTITY(); END
同时在EF Core中配置了实体映射:
internal class CustomerMap : EntityMappingConfiguration<Customer> { public override void Map(EntityTypeBuilder<Customer> b) { b.ToTable("Customers").HasKey(t => t.Id); b.ToTable(t => t.HasTrigger("ReferenceTrigger")); b.Property(t => t.Id).HasColumnName("Id").ValueGeneratedOnAdd(); } //etc... }
调用数据库上下文的CommitChanges()方法时,收到如下警告:
读取SaveChanges操作结果时发现意外的尾随结果集;这可能表示存储过程返回了结果集,但未在EF模型中配置。请检查存储过程定义。
解决方法
警告的核心原因是触发器返回了两个结果集:
INSERT语句中的OUTPUT inserted.Id输出第一个结果集- 末尾的
SELECT Id FROM Customers...输出第二个结果集
EF Core仅预期获取插入后的Id结果集,多余的结果集会被判定为“意外尾随结果集”,只需修改触发器代码,确保只返回一个结果集即可消除警告。
方案一:保留OUTPUT语句,移除末尾SELECT
修改后的触发器代码:
CREATE TRIGGER [dbo].[ReferenceTrigger] ON [dbo].[Customers] INSTEAD OF INSERT AS BEGIN DECLARE @reference varchar(6); --And set INSERT INTO Customers OUTPUT inserted.Id SELECT --Here the original fields... Reference = @reference --修正原代码笔误:@string应为@reference FROM inserted; END
OUTPUT inserted.Id已能返回插入的Id,无需额外执行SELECT查询。
方案二:移除OUTPUT语句,保留末尾SELECT
若更倾向于用SCOPE_IDENTITY()获取Id,修改后的触发器代码:
CREATE TRIGGER [dbo].[ReferenceTrigger] ON [dbo].[Customers] INSTEAD OF INSERT AS BEGIN DECLARE @reference varchar(6); --And set INSERT INTO Customers SELECT --Here the original fields... Reference = @reference --修正原代码笔误:@string应为@reference FROM inserted; IF @@ROWCOUNT > 0 BEGIN SELECT SCOPE_IDENTITY() AS Id; END END
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

