【问题标题】:Force entity framework to use multiline/multirecords sql syntax强制实体框架使用多行/多记录 sql 语法
【发布时间】:2015-09-24 15:41:22
【问题描述】:

实体框架有没有办法在向服务器发送查询时使用下一个语法:

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

因为这会提高性能。我正在使用 sql profiler 并看到默认情况下它使用单数插入,例如

INSERT INTO MyTable (id, name) VALUES (1, 'Bob')
INSERT INTO MyTable (id, name) VALUES (2, 'Peter')
INSERT INTO MyTable (id, name) VALUES (3, 'Joe')

我知道有很多原因不支持此功能,例如 sql server 最大数据包大小,....只是询问是否可能。

【问题讨论】:

  • 我认为第一个语法是为了方便,它总是解析为第二个查询。这并不意味着 db 有 3 次往返,它们可能在一次往返中一起发送。
  • 其实我认为 EF 也使用 AddRange 的往返
  • 使用 sql profiler 查看,实体框架将每个查询发送到服务器。当然在事务中,例如:开始事务插入 t1 () values(),插入 t1()values(),提交。即使使用 AddRange 也是如此。即使实体框架确实在一次往返中发送了所有三个查询,sql server 也会单独执行它们。

标签: entity-framework entity-framework-6


【解决方案1】:

在 Stack Overflow 上有几个与插入性能相关的问题。一些与变得巨大的上下文相关,因此添加到 DbSet 变得更慢,一些与 DBMS 性能有关。

如果你使用 SQL Server,你可以试试这个助手 https://efbulkinsert.codeplex.com/ 它使用 System.Data.SqlClient.SqlBulkCopy 所以它应该比 Insert 更快。

【讨论】:

  • 我创建了自定义多记录插入方法,该方法像我的帖子中提到的那样插入表 (c1, c2) 值 (a,a), (b,b), .... 但点击sql server 的限制:最多允许 2100 个 sql 参数。所以是的,我相信如果你想快速插入大量记录,除了使用 SqlBulkCopy 之外别无选择。
  • 如果您对自己的过程更有信心,可以避免使用参数(注意 sql 注入)。如果您想独立于国家/地区设置(我在意大利,所以我必须每天处理它)只需记住使用单引号指定日期并使用 yyyymmdd 格式(如果在单引号中指定则支持)。如果您能回答一个问题,您是否从 DbSet 开始生成查询?
  • 不确定你的意思,但在我的例子中使用了典型的实体框架用法: class TaxablePersonContext : DbContext, using (TaxablePersonContext context = new TaxablePersonContext()) TaxablePerson p = new TaxablePerson() ... set属性...上下文。添加(p)。然后实体框架生成查询。
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多