我正在使用dapper使用此方法在一次数据库命中中添加多个新学生:
db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)",
students.Select(s => new { Name = s.Name, Age = s.Age })
);
但问题是我没有新的ID。
我可以制作一个db命中,还有一些如何获得新的ID? 如果没有,执行此类批量插入的最有效方法是什么?
答案 0 :(得分:5)
那是不批量插入;它基本上只是展开循环的简写;虽然有趣的是(或许) 可能会要求管道序列如果在您的连接上启用了“MARS”。没有管道,它基本上是的简写:
foreach(var obj in students.Select(s => new { Name = s.Name, Age = s.Age }))
{
await db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)", obj);
}
在这种情况下,您也可以使用Query
或ExecuteScalar
来获取SCOPE_IDENTITY()
。
使用管道,它更加微妙;它做了同样的事情,但是一次有多个未完成的命令(当积压已满时,或者当所有命令都被发出时,它只有await
)。
批量插入不返回ID。您可以考虑使用表值参数并使用INSERT
和OUTPUT
子句一次插入整个DataTable
数据(获取身份中的身份)过程),但在消极方面:确实涉及使用DataTable
; p
答案 1 :(得分:0)
免责声明:我是项目Dapper Plus
的所有者正如 Marc 回答的那样,Dapper 中没有 BulkInsert
。
但是,可以使用 Dapper Plus 实现它(该库是商业的)
您需要在映射中指定哪一列是身份(以便 id 自动填充到实体上)
// MAP once
DapperPlusManager.Entity<Invoice>().Identity(x => x.InvoiceID);
connection.BulkInsert(invoices, x => x.InvoiceMeta, x => x.InvoiceItems);
甚至可以通过将身份传播指定为 true
// MAP once
DapperPlusManager.Entity<Invoice>().Identity(x => x.InvoiceID, true);
connection.BulkInsert(invoices, x => x.InvoiceMeta, x => x.InvoiceItems);
在这种情况下,InvoiceItem
将自动填充 InvoiceID
。
您可以在此处了解有关身份传播的更多信息:https://dapper-plus.net/getting-started-identity-propagation