如何加速DbSet.Add()?我必须将大约30k行从CSV文件导入到我的SQL数据库,这最多可能需要20分钟。使用探查器进行故障排除显示DbSet.Add花费的时间最多,但为什么呢?我有这些实体框架代码优先类:publicclassArticle{//大约20个属性,每个属性不存储过多的数据}publicclassDatabase:DbContext{publicDbSetArticles{get;放;对于我的for循环中的每个项目,我这样做:db.Articles.Add(article);在for循环之外,我做的是:db.SaveChanges();它与我的本地SQLExpress服务器连接,但我希望调用SaveChanges之前没有任何东西,所以我猜服务器不会是问题....工作单元中的每个项目都有开销它必须检查(和更新)身份管理器,添加到各种集合等。我要尝试的第一件事是将500个一组(更改该数字以适应),从一个新的(新的)对象上下文开始每次-否则你可以合理地期望缩放性能。将其分成批次还可以防止整体事务导致一切停止。除此之外;SqlBulkCopy。它专为以最少的开销进行大量导入而设计。但这不是英孚。根据KevinRamen的评论(3月29日),我可以确认设置db.Configuration.AutoDetectChangesEnabled=false对速度有巨大影响默认情况下,在我的机器上运行Add()2324项需要3分15秒,禁用自动-检测导致操作在0.5秒内完成。http://blog.larud.net/archive/2011/07/12/bulk-load-items-to-a-ef-4-1-code-first-aspx我将添加到KervinRamen的评论中说如果你只进行插入(不更新或删除),然后您可以在对上下文进行任何插入之前安全地设置以下属性:DbContext.Configuration.AutoDetectChangesEnabled=false;DbContext.Configuration.ValidateOnSaveEnabled=false;我在工作中遇到了一次性批量导入问题。在不设置上述属性的情况下,将大约7500个复杂对象添加到上下文中需要30多分钟。设置上述属性(禁用EF检查和更改跟踪)可将导入时间缩短至几秒钟。但是,同样,只有在插入时才使用它。如果您需要混合插入与更新/删除,您可以将代码拆分为两个路径并禁用插入部分的EF检查,然后重新启用更新/删除路径的检查。我已经成功地使用这种方法来解决缓慢的DbSet.Add()行为。这是一个非常易于使用且非常快速的扩展:https://efbulkinsert.codeplex.com/它被称为“实体框架批量插入”。扩展本身位于命名空间EntityFramework.BulkInsert.Extensions中。因此,要显示扩展方法,请添加使用usingEntityFramework.BulkInsert.Extensions;然后你可以这样做context.BulkInsert(entities);顺便说一句——如果出于某种原因你不想使用这个扩展,你也可以尝试为每篇文章运行db.Articles.Add(article),一次创建多篇文章的列表并将它们一起添加到dbcontext使用AddRange(EF版本6中的新增功能以及RemoveRange)。我还没有真正尝试过,但我的逻辑是坚持使用ODBC驱动程序将文件加载到数据表中,然后使用sql存储过程将表传递给过程。对于第一部分尝试:http://www.c-sharpcorner.com/UploadFile/mahesh/AccessTextDb12052005071306AM/AccessTextDb.aspx对于第二部分尝试SQL过程:http://www.builderau.com.au/program/sqlserver/soa/Passing-table-valued-parameters-in-SQL-Server-2008/0,339028455,339282577,00.htm并在c#中创建一个SqlCommnand对象并添加到其Parameters集合SqlParameter中,即SqlDbType.Structured,我希望它有所帮助。以上就是C#学习教程:如何加速DbSet.Add()?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
