繁体   English   中英

实体框架节省了很长时间

[英]entity framework save taking a long time

这里有很多关于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(我不确定它会有多大帮助)。 我试图插入大约10密耳的范围。

编辑:

我觉得愚蠢,但我试图使用bulkInsert,我不断得到这个实体不存在的错误,我看看这段代码

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

    ctx.BulkInsert(entities);

    ctx.SaveChanges();
    transactionScope.Complete();
  }
}

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

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

在负载下暂停调试器10次并查看包含外部代码的堆栈。 它最经常停在哪里?

它花了很长时间在.SaveChanges()上。 只是从一些快速测试,ADO.net代码

这意味着网络延迟和服务器执行时间正在导致此问题。 对于插入服务器,执行时间通常不是那么高。 您无法对使用EF的网络延迟执行任何操作,因为它会为每个插入发送一个批处理。 (是的,这是框架的缺陷。)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM