Sql Dapper-批量插入新项目并获取新ID
我正在使用dapper使用以下方法在一次db命中中添加多个新学生:Sql Dapper-批量插入新项目并获取新ID,sql,c#-4.0,dapper,bulkinsert,Sql,C# 4.0,Dapper,Bulkinsert,我正在使用dapper使用以下方法在一次db命中中添加多个新学生: db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)", students.Select(s => new { Name = s.Name, Age = s.Age }) ); 但问题是我没有新的身份证 我能打一次db,还是怎么得到新的ID? 如果不是,执行这种批量插入的最有效方式是什么?不是批量插入;基本上,这仅仅是展开循环的速记;尽管有趣的
db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)",
students.Select(s => new { Name = s.Name, Age = s.Age })
);
但问题是我没有新的身份证
我能打一次db,还是怎么得到新的ID?如果不是,执行这种批量插入的最有效方式是什么?不是批量插入;基本上,这仅仅是展开循环的速记;尽管有趣的是(也许)如果在你的连接上启用了“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\u IDENTITY()
有了管道,就更微妙了;它做同样的事情,但是一次有多个未完成的命令(当积压工作已满或所有命令都已发出时,它只等待s)
大容量插入不返回ID。您可以考虑使用表值参数并使用<代码> INSERT <代码> > <代码>输出<代码>子句,每次插入一个完整的<代码> DATABATE <代码>数据(在进程中获得标识),但在负面方面:它涉及使用<代码> DATABATE ;p免责声明:我是项目的所有者 正如马克回答的那样,Dapper中没有
BulkInsert
但是,可以通过Dapper Plus实现(该库是商业性的)
您需要在映射中指定哪个列是标识(以便在实体上自动填充标识)
在这种情况下,InvoiceItem
将自动填充InvoiceID
您可以在此处了解有关身份传播的更多信息:作为旁白;您不需要执行
。选择(…)
;它与justdb.Execute[Async](“…”),students)
同样适用。它会执行一些基本的正则表达式检查,以确定哪些属性可能有用-它不会将每个属性都添加为参数。存储过程除外;P
// MAP once
DapperPlusManager.Entity<Invoice>().Identity(x => x.InvoiceID);
connection.BulkInsert(invoices, x => x.InvoiceMeta, x => x.InvoiceItems);
// MAP once
DapperPlusManager.Entity<Invoice>().Identity(x => x.InvoiceID, true);
connection.BulkInsert(invoices, x => x.InvoiceMeta, x => x.InvoiceItems);