You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:42:51