C# 如何在EF中使用一个Insert查询添加多行

C# 如何在EF中使用一个Insert查询添加多行,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有一个长度未知的字符串列表。 我正在将它们添加到数据库中: if (somenteNovasClas.Any()) { foreach (string item in wsClassificacoes) { dc.Classificacaos.Add(new Classificacao { Descricao = item }); } dc.SaveChanges(); } 但EF将为每行生成一个插入: exec sp_executesql N'ins

我有一个长度未知的字符串列表。 我正在将它们添加到数据库中:

if (somenteNovasClas.Any()) {
    foreach (string item in wsClassificacoes) {
        dc.Classificacaos.Add(new Classificacao { Descricao = item });
    }
    dc.SaveChanges();
}
但EF将为每行生成一个插入:

exec sp_executesql N'insert [dbo].[Classificacao]([Descricao], [Excluido])
values (@0, @1)
select [CodClassificacao]
from [dbo].[Classificacao]
where @@ROWCOUNT > 0 and [CodClassificacao] = scope_identity()',N'@0 varchar(255),@1 bit',@0='Mercado',@1=0
go
exec sp_executesql N'insert [dbo].[Classificacao]([Descricao], [Excluido])
values (@0, @1)
select [CodClassificacao]
from [dbo].[Classificacao]
where @@ROWCOUNT > 0 and [CodClassificacao] = scope_identity()',N'@0 varchar(255),@1 bit',@0='Concorrência',@1=0
go
我想知道如何一次性插入EF将生成如下命令:

INSERT INTO Table (column)
VALUES ([array[0]]), ([array[1]]), ...
而不是每次插入一个。。 有什么想法吗?

看看这篇文章:


Entity framework实际上并不是要开箱即用,但看起来人们已经创建了一些扩展:

Entity framework core 3+在这方面有了显著的改进。当有多个具有相同形状的插入时,对于Sql Server,它将生成合并语句,而不是单独的插入语句

例如,添加10个新产品:

声明@inserted0表[Id]int、[u位置][int]; 使用合并[产品] 值@p0、@p1、@p2、@p3、@p4、0、, @p5、@p6、@p7、@p8、@p9、1、, @p10、@p11、@p12、@p13、@p14、2、, @p15、@p16、@p17、@p18、@p19、3、, @p20、@p21、@p22、@p23、@p24、4、, @p25、@p26、@p27、@p28、@p29、5、, @p30、@p31、@p32、@p33、@p34、6、, @p35、@p36、@p37、@p38、@p39、7、, @p40、@p41、@p42、@p43、@p44、8、, @p45、@p46、@p47、@p48、@p49、9作为i[Image]、[ProductName]、[QuantityPerUnit]、[StartDate]、[UnitPrice]、\u在1上的位置=0 当不匹配时 插入[Image]、[ProductName]、[QuantityPerUnit]、[StartDate]、[UnitPrice] 值i.[Image]、i.[ProductName]、i.[QuantityPerUnit]、i.[StartDate]、i.[UnitPrice] 插入输出。[Id],i.\U位置 插入@inserted0; 从[Products]t中选择[t].[Id],[t].[RowVersion] [t].[Id]=[i].[Id]上的内部连接@inserted0 i [i].[u位置]命令; 最后的SELECT查询用于将生成的Id和RowVersion值反馈到C对象中

当有大量插入时,EF不会达到最大参数阈值,它只生成多个MERGE语句块


它与带有值构造函数的insert语句不同,但仍然比无数单独的insert语句好得多。

您如何知道EF为每行生成一个insert?使用Fair就足够了。请出示你的C代码。我怀疑你没有按照MSFT的意图来写。我很确定EF可以做批量插入。我不确定你想实现什么。除非您从SqlBulkCopy或外部数据源进行大容量插入,否则这是唯一一种可以快速完成的方法,而且您的执行方式仍然非常快。EF永远不会使用所谓的行构造函数生成sql语句。这不是它的特点之一。