Entity Framework Core带参数的多命令事务执行异常求助
关于EF事务中执行带参数SQL命令的问题解答
嘿,我懂你遇到的麻烦了!你想在EF的事务里执行一段包含临时表创建和数据插入的SQL,还得带参数对吧?从你给出的代码片段来看,有几个关键地方得调整,不然很容易出现事务不生效、临时表找不到或者参数失效的问题。
核心问题的解决思路
确保SQL命令在EF事务范围内
你直接new SqlCommand()的话,这个命令没关联到EF的事务连接上,相当于在独立会话里执行,肯定出问题。正确做法是从EF上下文的连接创建命令,同时绑定当前事务。参数的正确使用(防注入+生效)
虽然你的代码没写完参数部分,但一定要用SqlParameter传递参数,不能直接拼字符串,既安全又能保证参数正确传递到SQL里。临时表的会话一致性
SQL Server的#临时表是会话级的,要确保创建和使用临时表的命令都在同一个数据库连接里,最好显式打开连接,避免EF自动释放连接导致临时表消失。
修正后的完整示例代码
using (var db = new BloggingContext()) { // 显式打开连接,保证临时表在同一个会话生命周期内 db.Database.Connection.Open(); using (IDbContextTransaction transaction = db.Database.BeginTransaction()) { try { // 从EF的连接创建SqlCommand,自动关联连接 using (var cmd = (SqlCommand)db.Database.Connection.CreateCommand()) { // 绑定当前事务,确保命令在事务范围内执行 cmd.Transaction = (SqlTransaction)transaction.UnderlyingTransaction; cmd.CommandText = @" CREATE TABLE [#sessionlist] (Id bigint); INSERT INTO #sessionlist SELECT BlogId FROM blogs WHERE rating >= @MinRating"; cmd.CommandType = CommandType.Text; // 添加参数,指定类型和值,避免注入和类型不匹配 cmd.Parameters.Add(new SqlParameter("@MinRating", SqlDbType.Int) { Value = 10 }); // 执行SQL命令 cmd.ExecuteNonQuery(); } // 这里可以继续执行其他关联操作,比如查询临时表数据 // var sessionIds = db.Database.SqlQuery<long>("SELECT Id FROM #sessionlist").ToList(); // 提交事务 transaction.Commit(); } catch (Exception ex) { // 出错回滚事务 transaction.Rollback(); // 可以在这里添加异常日志或处理逻辑 throw; } finally { // 最后关闭连接 if (db.Database.Connection.State == ConnectionState.Open) { db.Database.Connection.Close(); } } } }
额外注意事项
- 不要手动
new SqlCommand(),而是通过db.Database.Connection.CreateCommand()创建,这样能保证和EF上下文使用同一个连接。 - 临时表会在连接关闭后自动销毁,所以如果后续还要使用临时表,必须在连接关闭前完成所有操作。
- 事务提交或回滚后,临时表依然存在(只要连接没关),这里用#临时表比全局临时表(##开头)更合适,不会影响其他会话。
内容的提问来源于stack exchange,提问作者Dylan Orr
相关产品推荐
相关产品推荐

