gpt4 book ai didi

c# - Entity Framework : Execute multiple commands in one round trip

转载 作者:行者123 更新时间:2023-12-03 23:16:32 25 4
gpt4 key购买 nike

情况

我有很多参数化的 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");
}
}
}

上面的代码有效,事务回滚也按预期工作。

我的命令类如下所示:
public class SqlBuilderCommand
{
public string Sql { get; set; }

public List<SqlParameter> Parameter {get;set;}
}

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

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

Possible Duplicate 1

不幸的是,它对 Entity Framework 没有帮助(或者我只是不明白)

问题
  • 是否可以在一次往返中执行列表中的所有命令?
  • 如果没有,是否可以使用 ADO.NET?

  • 解决方案和缺点/限制

    感谢@Evgeni 提供正确答案。是的,您可以连接多个 SQL 字符串,并在一次往返中将参数作为列表发送。那太棒了。

    但是 SQL-Server 有一个限制。 SQL-Server 在一个命令中最多只接受 2100 个参数。因此,如果您有一个包含 7 个数据库列的对象,则每个命令的最大批量插入是 300 个对象。否则你会得到一个异常(exception)。

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

    在这一点上,我认为对我来说没有办法绕过原始 SQL,除非有人告诉我,有一种方法可以加速 sql 命令。

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

    最佳答案

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

        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);
    }

    所以我想如果你连接你的 sql,它应该可以工作。

    关于c# - Entity Framework : Execute multiple commands in one round trip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42372677/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com