繁体   English   中英

如何使用Dapper使用外键批量插入?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM