实体框架:一次往返执行多个命令

Mic*_*ael 2 c# sql-server command entity-framework roundtrip

情况

我有许多参数化的SQL命令。我在一个循环中一个接一个地执行这些命令,如下所示:

public void SaveChanges()
{
    using (var ts = _Context.Database.BeginTransaction())
    {
        try
        {
            _Context.SaveChanges();

            foreach (var cmd in _Commands)
            {
                if (cmd.Parameter != null)
                {
                    _Context.Database.ExecuteSqlCommand(cmd.Sql, cmd.Parameter.ToArray()); 
                }
            }

            ts.Commit();
        }
        catch (Exception ex)
        {
            ts.Rollback();
            throw new Exception("SaveChanges");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以正常工作,事务回滚也可以正常工作。

我的命令类如下所示:

public class SqlBuilderCommand
{
    public string Sql { get; set; }

    public List<SqlParameter>  Parameter {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

没有具体解决方案的可能重复

我已经找到了这个问题的几个可能的重复。最接近的是:

可能重复1

不幸的是,它对我使用实体框架没有帮助(或者我只是不明白)

问题

  1. 是否可以一次往返执行列表中的所有命令?

  2. 如果不是,是否可以使用ADO.NET?

解决方案和缺点/局限性

感谢@Evgeni的正确答案。是的,您可以连接许多SQL字符串,并且只需一次往返就可以将参数作为列表发送。那很棒。

但是SQL-Server有一个限制。SQL-Server仅通过一个命令最多接受2100个参数。因此,如果您的对象具有7个数据库列,则每个命令的最大批量插入量为300个对象。否则,您将获得例外。

如果我对5000个对象执行此操作,则会导致17个大容量插入(5000/300)。我停止了5000个对象的时间,但仍然是8到9秒,这太慢了,因为我知道原始SQL会更快得多。

在这一点上,我认为对我而言,没有办法解决原始SQL,除非有人告诉我,有一种方法可以加快sql命令的速度。

也许我会为此写一个后续问题。该死的。

Evg*_*eni 5

从技术上讲,您可以一次执行多个命令:

    var n1 = new SqlParameter("@name1", System.Data.SqlDbType.VarChar);
    n1.Value = "name 1 ";
    var u1 = new SqlParameter("@uid1", System.Data.SqlDbType.UniqueIdentifier);
    u1.Value = Guid.Parse("guid here");
    var n2 = new SqlParameter("@name2", System.Data.SqlDbType.VarChar);
    n2.Value = "name2";
    var u2 = new SqlParameter("@uid2", System.Data.SqlDbType.UniqueIdentifier);
    u2.Value = Guid.Parse("guid here");
    var sqlParams = new[]
    {
        n1, n2, u1, u2
    };

    using (var db = new DbContext("default"))
    {

        db.Database.ExecuteSqlCommand(@"
            Update property set name = @name1 where uid = @uid1; 
            Update property set name = @name2 where uid = @uid2;", sqlParams);
    }
Run Code Online (Sandbox Code Playgroud)

因此,我想如果您将sql连接起来,它应该可以正常工作。