Dapper - 批量插入新项目并获取新ID

时间:2014-10-09 13:13:20

标签: sql c#-4.0 bulkinsert dapper dapper-extensions

我正在使用dapper使用此方法在一次数据库命中中添加多个新学生:

db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)", 
  students.Select(s => new { Name = s.Name, Age = s.Age })
);

但问题是我没有新的ID。

我可以制作一个db命中,还有一些如何获得新的ID? 如果没有,执行此类批量插入的最有效方法是什么?

2 个答案:

答案 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);
}

在这种情况下,您也可以使用QueryExecuteScalar来获取SCOPE_IDENTITY()

使用管道,它更加微妙;它做了同样的事情,但是一次有多个未完成的命令(当积压已满时,或者当所有命令都被发出时,它只有await)。

批量插入不返回ID。您可以考虑使用表值参数并使用INSERTOUTPUT子句一次插入整个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