我的问题是三个折叠:
如果我尝试使用实体框架进行批量插入,它确实对每个插入的数据行使用 1 个插入,这是真的吗?(因此每个插入都有一个往返)。因此性能低于使用 SQL“插入”?
是的。如果要使用 EF,请将以下属性设置为 false 以获得更快的性能:
MyContext.Configuration.AutoDetectChangesEnabled = false;
MyContext.Configuration.ValidateOnSaveEnabled = false;
这对删除语句也适用吗?
是的。您也可以在数据库上定义On Delete Cascade,然后数据库将删除引用的实体,因此无需使用 EF 执行此操作。
这里的最佳做法是什么?使用 SQL 语句?还是使用实体框架,或者完全是别的什么?
您可以使用存储过程,在您的 Context 上调用 Query
MyContext.ExecuteStoreQuery("your query")
或者
MyContext.Database.SqlCommand("your query");
另一种方法是SaveChanges()
在一批(100、200 个标记为已添加或已删除的实体)之后调用,然后释放上下文,以便实体不再附加。然后创建一个新的上下文进行批处理并SaveChanges()
再次调用。
更新
我没有使用这种方法,但您可以尝试一下。
用于通用列表的 SqlBulkCopy(对实体框架和 NHibernate 很有用)
下面的可重用通用版本,在 2.4 秒内产生 15k 插入或每秒 +- 6200 行。我在 39 秒内将它增加到 4 个目录,224392 行,速度为 +- 5750 rps(在 4 个文件之间切换)。