gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:51:37 25 4
gpt4 key购买 nike

我有一个像这样的 C# 数据结构:

public class Invoice
{
public string InvoiceNumber {get;set;}
public List<SalesPerson> SalesPersons {get;set;}
}

public class SalesPerson
{
public string Name {get;set;}
}

这对应于两个表:Invoice 和 SalesPerson。一张发票可以有任意数量的此类关联。

现在,我正在创建一个批量上传工具,接收 CSV 并创建一个发票集合(每个发票都有一定数量的相关销售人员记录)。

我可以想到一种使用 Dapper 执行此操作的简单方法:遍历每个发票,插入它,获取身份(整数 ID 列),遍历该发票中的每个销售人员,使用我作为外国人获得的身份插入 key 。但这似乎会导致大量不必要的流量进出我的 SQL 服务器。

我知道我可以多次执行插入命令的“批量”插入,但我不知道在这种情况下它是如何工作的,因为我当时不知道外键'正在构建参数。

有没有比我上面概述的简单方法更好的插入方法? 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 中创建命名类型。但如果您想考虑这条路线,请参阅 Does Dapper support SQL 2008 Table-Valued Parameters?

table-valued-parameters 选项的一个优点是您可以将 INSERT 语句与 OUTPUT clause 结合起来一次性取回所有 ID。相比之下:使用 SqlBulkCopy 时,您需要在插入 之后查询数据(本质上:SqlBulkCopy 操作没有返回任何结果)。

关于c# - 如何使用 Dapper 批量插入外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com