【问题标题】:Entity Framework Insert Into Table With AFTER INSERT Trigger使用 AFTER INSERT 触发器将实体框架插入到表中
【发布时间】:2018-03-02 19:02:27
【问题描述】:

我正在开发一个 Web API 和实体框架 6,它在任何给定时间将 500 条以下的记录“批量”插入到 Microsoft SQL Server 表中。 DbContext.SaveChanges() 方法将在几秒钟内将所有记录插入表中,因此没有问题。但是,当调用该方法以将相同数量的记录插入到同一个表中并附加一个半扩展触发器时,该过程可能需要很多分钟。触发器调用了一些表连接并插入到其他表中,然后删除了新插入的记录。

我对表或触发器没有太多控制权,因此我正在寻找有关如何提高性能的建议。我提出了将触发器移动到存储过程并让触发器调用存储过程的建议,但我不确定这是否会有所收获。

编辑:据我所知,我的问题有点笼统,我会发布一些代码以防万一。 SQL 不是我的,所以我会看看我能实际发布什么。

这是我的 Web API 方法中调用 SaveChanges() 的部分:

string[] stringArray = results[0].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);

var profileObjs = db.Set<T_ProfileStaging>();
foreach (var s in stringArray)
{

    string[] columns = s.Split(new[] {",", "\t"}, StringSplitOptions.None);
    if (columns.Length == 6)
    {
        T_ProfileStaging profileObj = new T_ProfileStaging();

        profileObj.CompanyCode = columns[0];
        profileObj.SubmittedBy = columns[1];
        profileObj.VersionName = columns[2];
        profileObj.DMName = columns[3];
        profileObj.Zone = columns[4];
        profileObj.DMCode = columns[5];
        profileObj.ProfileName = columns[6];
        profileObj.Advertiser = columns[7];
        profileObj.OriginalInsertDate = columns[8];

        profileObjs.Add(profileObj);
    }
}

try
{
    db.SaveChanges();
    return Ok();
}
catch (Exception e)
{
    return Content(HttpStatusCode.BadRequest, "SQL Server Insert Exception");
}

【问题讨论】:

  • 所以用户真的没有什么可以为你提供的。您没有提供 c# 或 SQL 代码,所以我们无事可做。

标签: sql-server entity-framework triggers


【解决方案1】:

当您使用 SaveChanges() 加载时,EF 将在单独的 INSERT 语句中发送每一行。因此,如果您有一个语句触发器,它将针对每一行运行。

要解决这个问题,您需要

  • 使用客户端的批量加载 API(而不是 EF 的 SaveChanges())直接使用 SqlBulkCopy 或包装它的众多 EF 扩展之一。

或

  • 将 EF 配置为插入到不同的表中,然后将 INSERT ... SELECT 到目标表中

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多