首页 > 解决方案 > 带有参数的 Entity Framework Core 事务

问题描述

这是一个简单的示例,但显示了我遇到的错误。我正在尝试在事务中运行两个都有参数的命令。

例子

using (var db = new BloggingContext())
{
    using (IDbContextTransaction t = db.Database.BeginTransaction())
    { 
        using (var cmd = (IDbCommand) new SqlCommand())
        {
            cmd.CommandText = "CREATE TABLE [#sessionlist] (Id bigint);" +
                "Insert into #sessionlist " +
                "select BlogId from blogs " +
                "where rating >= 10";
            cmd.CommandType = CommandType.Text;

            var p = cmd.CreateParameter();
            p.ParameterName = "rating";
            p.Value = 10;
            cmd.Parameters.Add(p);

            cmd.Connection = db.Database.GetDbConnection();
            cmd.Transaction = t.GetDbTransaction();
            cmd.ExecuteNonQuery();
        }

        using (var cmd = (IDbCommand) new SqlCommand())
        {
            cmd.CommandText = "update blogs set rating = @rating where BlogId in (select * from #sessionList)";
            cmd.CommandType = CommandType.Text;

            var p = cmd.CreateParameter();
            p.ParameterName = "rating";
            p.Value = 10;
            cmd.Parameters.Add(p);

            cmd.Connection = db.Database.GetDbConnection();
            cmd.Transaction = t.GetDbTransaction();
            cmd.ExecuteNonQuery();
        }

        t.Commit();
    }
}

运行此命令失败并显示无效的对象名称#sessionlist,因为它似乎没有在同一个事务中运行。如果在第一个 cmd 中被修改,则不添加任何参数,而是硬编码参数。它执行正常。

如何在单个事务中运行多个命令,这两个命令都有自己的参数?

生产代码更复杂,并且确实需要将两个命令分开,因为它创建了一个在第二个命令中引用的重型临时表。

标签: c#sqlentity-framework-core

解决方案


推荐阅读