[英]How to use Dapper for bulk insert with foreign keys?
我有一个C#数据结构,如下所示:
public class Invoice
{
public string InvoiceNumber {get;set;}
public List<SalesPerson> SalesPersons {get;set;}
}
public class SalesPerson
{
public string Name {get;set;}
}
这对应于两个表:发票和SalesPerson。 发票可以具有任意数量的这些关联。
现在,我正在创建一个批量上载工具,接收一个CSV文件并创建了一个发票集合(每个发票都有一些关联的SalesPerson记录)。
我可以想到一种用Dapper执行此操作的简单方法:遍历每个发票,插入它,获取标识(整数ID列),遍历该发票中的每个SalesPerson,并使用我作为外键获得的身份进行插入。 但这似乎会给SQL Server带来大量不必要的流量。
我知道可以在其中多次执行插入命令的“批量”插入,但是在这种情况下,我不知道这样做如何工作,因为在构造时我不知道外键参数。
是否有比我上面概述的天真的方法更好的插入方法? Dapper是否为此使用了错误的工具? (我使用的是SQL Server;如果有一些可以帮助我的tSQL命令,我不知道它们)
Dapper旨在成为通用ADO.NET工具,对提供者特定的功能提供一些最小的支持。 批量插入不是通用的API-不是通用的批量插入类。 如果使用的是SQL Server,则SqlBulkCopy
将是显而易见的选择。 当将其与基于类的对象模型结合使用时, FastMember是一个很好的盟友。 例如:
var data = ... // some List<Foo> where Foo has Id, Name and Description
using(var bcp = new SqlBulkCopy(connection)) // SqlBulkCopy
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) // FastMember
{
// these bits are part of the SqlBulkCopy API; WriteToServer accepts *either* a
// DataTable or an IDataReader; we're providing the latter via FastMember
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
就dapper而言 , 它支持表值参数,但这需要您在SQL Server中创建一个命名类型。 但是,如果要考虑该路线,请参阅Dapper是否支持SQL 2008表值参数?
table-valued-parameters选项的一个优点是,您可以将INSERT
语句与OUTPUT
子句结合使用,以一次性获得所有ID。 相比之下:使用SqlBulkCopy
您将需要在插入后查询数据(本质上是: SqlBulkCopy
操作什么也没回来)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.