簡體   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