首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架节省了很长时间

实体框架节省了很长时间
EN

Stack Overflow用户
提问于 2014-08-13 16:19:34
回答 1查看 3K关注 0票数 3

这里有很多关于EF的文章花了很长的时间来保存,但是我已经看过它们并使用了它们的答案,并且似乎仍然得到了非常缓慢的结果。

我的代码是这样的:

代码语言:javascript
复制
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并不断地获得这个实体不存在错误,我看了下面的代码

代码语言:javascript
复制
using (var ctx = GetContext())
{
  using (var transactionScope = new TransactionScope())
  {
    // some stuff in dbcontext

    ctx.BulkInsert(entities);

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-13 17:14:04

在加载下暂停调试器10次,查看堆栈,包括外部代码。它最常停在哪里?

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

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

不要将EF用于批量工作。考虑使用表值参数或SqlBulkCopy或任何其他批量插入方法(如从注释中插入阿杜西的建议 )。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25291265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档