实体框架节省了很长时间

Mr.*_*ome 3 c# entity-framework

这里有很多关于 EF 的文章需要很长时间才能保存,但我浏览了它们并使用了他们的答案,但似乎仍然得到非常慢的结果。

我的代码看起来像这样:

using (MarketingEntities1 db = new MarketingEntities1())
        {
            //using (var trans = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
            //{
                int count = 0;
                db.Configuration.AutoDetectChangesEnabled = false;
                db.Configuration.ValidateOnSaveEnabled = false;
                while (count < ranges.Count)
                {
                    if (bgw != null)
                    {
                        bgw.ReportProgress(0, "Saving count: " + count.ToString());
                    }
                    db.Set<xGeoIPRanx>().AddRange(ranges.Skip(count).Take(BATCHCOUNT));
                    db.SaveChanges();
                    count+=BATCHCOUNT;

                }
                //trans.Commit();
            //}
        }
Run Code Online (Sandbox Code Playgroud)

每个批次需要 30 秒以上才能完成。BatchCount 是 1000。我知道 EF 并没有那么慢。你可以看到我已经停止使用事务,我已经取消了跟踪,但这些似乎都没有帮助。

更多信息:

xGeoIpRanx 是一个空表,没有 PK(我不确定它会有多大帮助)。我正在尝试插入大约 1000 万个范围。

编辑:

我觉得很愚蠢,但我尝试使用bulkInsert,但我不断收到此实体不存在的错误,我查看了这段代码

using (var ctx = GetContext())
{
  using (var transactionScope = new TransactionScope())
  {
    // some stuff in dbcontext

    ctx.BulkInsert(entities);

    ctx.SaveChanges();
    transactionScope.Complete();
  }
}
Run Code Online (Sandbox Code Playgroud)

什么是“实体”我尝试了实体列表,但不起作用,那是什么数据类型?

nvm 它按预期工作,由于我生成 edmx 文件的方式,这是一个奇怪的错误

usr*_*usr 5

在负载下暂停调试器 10 次,然后查看包括外部代码在内的堆栈。最常停在哪里?

.SaveChanges() 花费了很长时间。仅通过一些快速测试,ADO.net 代码

这意味着网络延迟和服务器执行时间导致了这种情况。对于插入服务器执行时间通常不会那么长。您无法使用 EF 对网络延迟采取任何措施,因为它每次插入都会发送一批。(是的,这是框架的缺陷。)。

不要使用 EF 进行批量工作。考虑使用表值参数或SqlBulkCopy任何其他批量插入方式,例如评论中Aducci 的提案。