我们的应用程序有一个巨大的性能问题,我们从不同的系统收集数据,并将其保存在数据库中,以便稍后生成一些报告。
我们使用实体框架4.2和DbSets,有没有比DbSet上每个实体的Add方法更好的批量插入方法?因为Add逻辑存在巨大的性能问题。
oneThousandCustomers.Foreach(c => context.Customers.Add(c)); //This will take a minute
context.SaveChanges(); //This takes under a second
我猜add方法在幕后做了很多查找等工作,但我只想批量插入这些数据。有可能吗?
发布于 2012-03-08 17:42:18
好的,这里的问题是,当你向集合中添加一个项目时,EF会在幕后做很多事情。
在性能方面真正重要的是,它会在每个枚举整个对象图的add命令上自动调用DetectChanges()。
这意味着,如果当前EF上下文正在跟踪大量的项目,这将导致一些非常严重的性能问题。
这里有一些提高性能的技巧,作为比较,我可以在1/2秒内插入1000个没有FK的相当简单的实体到EF。
的自动更改检测
关闭自动检测更改的代码
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
发布于 2012-03-08 17:34:55
您可以使用LinqEntityDataReader在实体集合上执行SqlBulkCopy,这将提高性能在您的应用程序中输入链接描述。
https://stackoverflow.com/questions/9615303
复制相似问题