实体框架节省了很长时间

时间:2014-08-13 16:19:35

标签: 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(我不确定它会有多大帮助)。我正试图插入大约10密耳的范围。

编辑:

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

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

    ctx.BulkInsert(entities);

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

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

nvm它按预期工作,由于我如何生成edmx文件

,这是一个奇怪的错误

1 个答案:

答案 0 :(得分:4)

  

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

  

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

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

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