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