使用 Dapper .Net 使用范围标识批量插入多个关系表

Rak*_*esh 3 sql sql-server c#-4.0 dapper

我需要导入多个sql server关系表中的数百万条记录。

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
Run Code Online (Sandbox Code Playgroud)

如何在一个 Insert 语句中使用 dapper 批量插入数百万条记录的集合

Mar*_*ell 5

Dapper 只是包装原始的 ADO.NET;原始 ADO.NET 不提供此功能,因此 dapper 也不提供。你想要的是SqlBulkCopy。您可以使用表值参数,但这确实感觉像是一项SqlBulkCopy工作。

在紧要关头,你可以在这里使用dapper -Execute将展开IEnumerable<T>成一系列命令T- 但它会是很多命令;除非您显式启用异步流水线,否则它将遭受每个命令的延迟(流水线模式避免了这种情况,但它仍然是 n 个命令)。但效率SqlBulkCopy会高很多

如果输入数据是 an IEnumerable<T>,您可能需要使用ObjectReaderfrom FastMember; 例如:

IEnumerable<SomeType> data = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
    bcp.DestinationTableName = "SomeTable";
    bcp.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)