使用 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 - ExecuteIEnumerable<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);
}