Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Dapper-批量插入新项目并获取新ID_Sql_C# 4.0_Dapper_Bulkinsert - Fatal编程技术网

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

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? 如果不是,执行这种批量插入的最有效方式是什么?不是批量插入;基本上,这仅仅是展开循环的速记;尽管有趣的

我正在使用dapper使用以下方法在一次db命中中添加多个新学生:

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


您可以在此处了解有关身份传播的更多信息:

作为旁白;您不需要执行
。选择(…)
;它与just
db.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);