Dapper - 새 항목 대량 삽입 및 새 ID 가져 오기

bulkinsert c#-4.0 dapper dapper-extensions sql

문제

나는 dapper를 사용하여이 방법을 사용하여 하나의 db 히트에 여러명의 신입생을 추가했다 :

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

하지만 문제는 새로운 ID가 없다는 것입니다.

하나의 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_IDENTITY() 를 가져올 수 있습니다.

파이프 라인으로, 그것은 더 미묘하다; 똑같은 일을하지만 한 번에 여러 개의 await 명령이 있습니다 (백 로그가 가득 차거나 모든 명령이 실행될 때만 await 립니다).

대량 삽입은 ID를 반환하지 않습니다. 당신은 테이블 반환 매개 변수를 사용하여 사용하는 것이 좋습니다 INSERTOUTPUT 전체 삽입 절 DataTable 한 번 (그 과정에서 정체성을 받고)에서 데이터를하지만 부정적인 측면에 : 그것은 사용 포함 않습니다 DataTable , P



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.