我们的应用程序存在巨大的性能问题,我们从不同的系统收集数据并将其保存在我们的数据库中以便稍后生成一些报告。
我们使用Entity框架4.2和DbSets,是否有更好的方法为DbSet上的每个实体执行批量插入然后添加方法?因为添加逻辑存在巨大的性能问题
oneThousandCustomers.Foreach(c => context.Customers.Add(c)); //This will take a minute
context.SaveChanges(); //This takes under a second
我想add方法正在进行大量的查找等工作,但我只想批量插入这些数据。有可能吗?
答案 0 :(得分:1)
好的,所以这里的交易是当你在一个集合中添加一个项目时,EF会在幕后做很多事情。
在性能方面真正重要的是它在每个添加命令上自动调用DetectChanges(),该命令枚举整个对象图。
这意味着如果您有大量的项目被当前的EF上下文跟踪,这将导致一些非常严重的性能问题。
下面是提高性能的一些技巧,作为比较,我可以在不到1/2秒的时间内将1000个相当简单的实体(没有FK)插入到EF中。
关闭自动检测更改的代码
context.Configuration.AutoDetectChangesEnabled = false;
当禁用AutoDetectChanges时,您需要小心一点,因为这意味着大多数EF automagic都会关闭,因此您可能会感到有些奇怪,尤其是在您使用导航属性或正在更新现有实体时。要解决这些问题,请在调用SaveChanges之前调用DetectChanges。这会降低性能,简单的添加操作不需要这样做,因此在您的示例中,如果没有此操作,您可能会离开。
这篇MSDN文章谈到了这一点,(注意即使它的EF 5在4中也是如此)http://msdn.microsoft.com/en-us/library/gg696177%28v=vs.103%29.aspx
答案 1 :(得分:0)
您可以使用LinqEntityDataReader在实体集合上执行SqlBulkCopy,这将提高性能,在您的应用程序中输入链接描述。