c# - Entity Framework 保存时间长

标签 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();
            //}
        }

每批需要 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();
  }
}

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

nvm 它按预期工作这是一个奇怪的错误,因为我如何生成 edmx 文件

最佳答案

Pause the debugger 10 times under load and look at the stack including external code. Where does it stop most often?

.

Its taking a long time on the .SaveChanges(). just from some quick tests, ADO.net code

这意味着网络延迟和服务器执行时间是造成这种情况的原因。对于插入服务器执行时间通常不会那么长。您无法使用 EF 对网络延迟做任何事情,因为它每次插入都会发送一个批处理。 (是的,这是框架的缺陷。)。

不要将 EF 用于批量工作。考虑使用表值参数或 SqlBulkCopy 或任何其他批量插入方式,例如 Aducci's proposal来自评论。

关于c# - Entity Framework 保存时间长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291265/

相关文章:

c# - 从 app.config 注入(inject)连接字符串与从 BaseDataProvider 类读取它

c# - 给定排序字符串的游程编码

.net - Entity Framework POCO 模板丢失(我使用的是 Visual Studio 2010 Professional )

c# - Autofac - 内存泄漏

c# - 如何从外部字符串文件创建数组

c# - 如何从任何对象属性为 null 或空的列表中删除所有?

c# - 在 WPF 中获取控件的可见大小

c# - linq选择总和和平均值进入 View 模型

entity-framework - 在 Azure 管理门户中进行设置时,无法使 EF 连接字符串正常工作?

entity-framework - Entity Framework 多对多问题