.Net Core EF使用FromSqlRaw插入返回自增ID报错求助
解决 EF Core 插入后获取自增 ID 的问题
以下是几种可行的解决方案,避开你遇到的非可组合SQL报错问题:
方法1:使用 ExecuteSqlScalar 直接获取自增ID
这是最直接高效的方式,无需用到 FromSqlRaw,直接执行带返回值的SQL语句:
// 推荐用SCOPE_IDENTITY()替代@@IDENTITY,避免触发器影响 var sql = @"INSERT INTO YourTable (Column1, Column2) VALUES (@val1, @val2); SELECT SCOPE_IDENTITY();"; var parameters = new[] { new SqlParameter("@val1", "你的值1"), new SqlParameter("@val2", "你的值2") }; // 执行并转换为对应的ID类型(比如int/long) var newId = (int)_dbContext.Database.ExecuteSqlScalar(sql, parameters);
说明:SCOPE_IDENTITY() 只会返回当前插入操作生成的自增ID,不受后续触发器插入其他表的影响,比 @@IDENTITY 更可靠。
方法2:使用 OUTPUT 子句返回插入的ID
SQL Server支持用 OUTPUT 子句在插入时直接返回指定列,同样可以通过 ExecuteSqlScalar 获取结果:
var sql = @"INSERT INTO YourTable (Column1, Column2) OUTPUT INSERTED.Id VALUES (@val1, @val2);"; var parameters = new[] { new SqlParameter("@val1", "你的值1"), new SqlParameter("@val2", "你的值2") }; var newId = (int)_dbContext.Database.ExecuteSqlScalar(sql, parameters);
说明:这种方式更直观,插入和返回一步完成,且不受触发器干扰(除非触发器修改了INSERTED表的列,但一般自增ID不会被触发器修改)。
方法3:调整 FromSqlRaw 的使用方式(不推荐,仅作参考)
如果一定要用 FromSqlRaw,需要通过 AsEnumerable() 强制将查询结果拉到客户端后再进行组合操作,避开EF的查询组合检查:
var sql = @"INSERT INTO YourTable (Column1, Column2) VALUES (@val1, @val2); SELECT SCOPE_IDENTITY() AS NewId;"; var parameters = new[] { new SqlParameter("@val1", "你的值1"), new SqlParameter("@val2", "你的值2") }; var newId = await _dbContext.Set<int>() .FromSqlRaw(sql, parameters) .AsEnumerable() // 强制在客户端处理后续操作 .FirstOrDefaultAsync();
说明:这种方式不如前两种高效,因为需要额外创建一个临时的实体集映射,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

