使用 Dapper .Net-using scope identity 在多个关系表中批量插入
Bulk Insert in multiple relational tables using Dapper .Net-using scope identity
我需要在多个 sql 服务器关系表中导入数百万条记录。
TableA(Aid(pk),Name,Color)----return id using scope identity
TableB(Bid,Aid(fk),Name)---Here we need to insert Aid(pk) which we got using scocpe Identity
我如何在一个 Insert 语句中使用 dapper 批量插入数百万条记录的集合
Dapper 只是原始包装 ADO.NET; raw ADO.NET 没有为此提供便利,因此 dapper 没有。你要的是SqlBulkCopy
。您可以 也 使用 table 值参数,但这确实感觉像是一项 SqlBulkCopy
工作。
在紧要关头,您可以在此处使用 dapper - Execute
将 IEnumerable<T>
展开为一系列关于 T
的命令 -但这将是很多命令;并且除非您明确启用异步流水线,否则它将遭受每个命令的延迟(流水线模式避免了这种情况,但它仍然是 n 个命令)。但是 SqlBulkCopy
会 多 更有效率。
如果输入数据是 IEnumerable<T>
,您可能需要使用 FastMember 的 ObjectReader
;例如:
IEnumerable<SomeType> data = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
我需要在多个 sql 服务器关系表中导入数百万条记录。
TableA(Aid(pk),Name,Color)----return id using scope identity
TableB(Bid,Aid(fk),Name)---Here we need to insert Aid(pk) which we got using scocpe Identity
我如何在一个 Insert 语句中使用 dapper 批量插入数百万条记录的集合
Dapper 只是原始包装 ADO.NET; raw ADO.NET 没有为此提供便利,因此 dapper 没有。你要的是SqlBulkCopy
。您可以 也 使用 table 值参数,但这确实感觉像是一项 SqlBulkCopy
工作。
在紧要关头,您可以在此处使用 dapper - Execute
将 IEnumerable<T>
展开为一系列关于 T
的命令 -但这将是很多命令;并且除非您明确启用异步流水线,否则它将遭受每个命令的延迟(流水线模式避免了这种情况,但它仍然是 n 个命令)。但是 SqlBulkCopy
会 多 更有效率。
如果输入数据是 IEnumerable<T>
,您可能需要使用 FastMember 的 ObjectReader
;例如:
IEnumerable<SomeType> data = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}