首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用EF4.2的批量插入

使用EF4.2的批量插入
EN

Stack Overflow用户
提问于 2012-03-08 17:25:35
回答 2查看 947关注 0票数 1

我们的应用程序有一个巨大的性能问题,我们从不同的系统收集数据,并将其保存在数据库中,以便稍后生成一些报告。

我们使用实体框架4.2和DbSets,有没有比DbSet上每个实体的Add方法更好的批量插入方法?因为Add逻辑存在巨大的性能问题。

代码语言:javascript
运行
复制
oneThousandCustomers.Foreach(c => context.Customers.Add(c)); //This will take a minute
context.SaveChanges(); //This takes under a second

我猜add方法在幕后做了很多查找等工作,但我只想批量插入这些数据。有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 17:42:18

好的,这里的问题是,当你向集合中添加一个项目时,EF会在幕后做很多事情。

在性能方面真正重要的是,它会在每个枚举整个对象图的add命令上自动调用DetectChanges()。

这意味着,如果当前EF上下文正在跟踪大量的项目,这将导致一些非常严重的性能问题。

这里有一些提高性能的技巧,作为比较,我可以在1/2秒内插入1000个没有FK的相当简单的实体到EF。

  • 请确保您的查询使用的是新的EF上下文实例,这将确保您的更改图较小,因此添加将相当快速。
  • DbContext

的自动更改检测

关闭自动检测更改的代码

代码语言:javascript
运行
复制
context.Configuration.AutoDetectChangesEnabled = false;

当禁用AutoDetectChanges时,你需要稍微小心一点,因为这意味着大多数EF自动关闭,所以你可能会得到一些奇怪的,特别是当你正在使用导航属性或正在更新现有的实体。要解决这些问题,请在调用SaveChanges之前调用DetectChanges。这会降低性能,简单的add操作不需要这样做,所以在您的示例中,您可能可以不使用它。

这篇MSDN文章谈到了这一点(请注意,尽管它的EF 5在4中是相同的) http://msdn.microsoft.com/en-us/library/gg696177%28v=vs.103%29.aspx

票数 1
EN

Stack Overflow用户

发布于 2012-03-08 17:34:55

您可以使用LinqEntityDataReader在实体集合上执行SqlBulkCopy,这将提高性能在您的应用程序中输入链接描述。

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

https://stackoverflow.com/questions/9615303

复制
相关文章

相似问题

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