首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF SaveChanges优化?

EF SaveChanges优化?
EN

Stack Overflow用户
提问于 2013-03-14 20:57:01
回答 1查看 203关注 0票数 3

为什么在每个SaveChanges()之后处理DbContext ctx的速度更快?

第一个示例:

代码语言:javascript
复制
var ctx = new DomainContext(); 
foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
        }

ctx.Dispose();

第二个示例:

代码语言:javascript
复制
foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            var ctx = new DomainContext(); 
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
            ctx.Dispose();
        }

在1000行上,第二个样本估计为8秒,而第一个样本为140秒。有没有办法清理ctx而不是重建?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 21:40:28

按照@JensKloster在评论中所说的那样,你肯定不想在循环中每次都调用SaveChanges。但我实际上会抵制住把它放在循环之外的诱惑。随着上下文跟踪的对象数量越来越多,更多的内存将被耗尽,这将使存储变得越来越慢。

因此,我为您提供的解决方案是在循环中设置一个运行计数器,以确定何时执行保存:

代码语言:javascript
复制
int numberOfRecords = 0;
using(var ctx = new DomainContext())
{
  foreach (var item in deals)
          {
              DealsOfReutersAddition newDealAddition =
                          new DealsOfReutersAddition
                          {
                              DealsOfReutersId = item.DealsOfReutersId,
                              DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                          };

              ctx.DealsOfReutersAdditions.Add(newDealAddition);

              numberOfRecords++;
              if(numberOfRecords % 500 == 0) //Saves after every 500 rows.
              {
                ctx.SaveChanges();
              }
           }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15409933

复制
相关文章

相似问题

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