Dapper 삽입 또는 업데이트?

dapper

문제

Dapper를 사용하기 시작한 적은 아직 없지만 대량 삽입 / 업데이트에 대한 연구를 진행하면서 오늘 발견했습니다. 현재 저는 EF6를 사용하고 있습니다.하지만 앞으로 Dapper를 사용하여 대량 자료를 보려고합니다. 이 응용 프로그램에는 ~ 15k 레코드가있을 수 있지만 ~ 100k 레코드가 될 수있는 다른 응용 프로그램이 있습니다.

다음 EF 코드를 Dapper로 변환 할 수있는 방법을 연구하려고합니다. 파일에서 레코드를 읽은 다음 해당 직원이 DB에 있는지 확인합니다. 그렇다면 파일의 값으로 등록 정보를 업데이트하고 그렇지 않으면 파일의 값을 사용하여 새 개체를 만듭니다.

주위를 둘러 보았을 때 어떤 예도 찾을 수 없었습니다. 내가 발견 할 수있는 것은 간단한 삽입 또는 업데이트를 수행하는 방법뿐이었습니다. 벌크 삽입 / 업데이트의 좋은 예는 실제로 찾지 못했습니다. Dapper를 사용하는 방법을 아직 이해하지 못하고있을 수도 있습니다.

내가 Dapper와 어떻게 할까?

int count = 1;
using (ctx = new DataContext())
{
    ctx.Configuration.AutoDetectChangesEnabled = false;      
    ctx.Configuration.ValidateOnSaveEnabled = false;

    while ((record = srFile.ReadLine()) != null)
    {
        int employeeId = int.Parse(record.Substring(2, 8));

        bio_employee employee = ctx.bio_employee.FirstOrDefault(e => e.emp_id == employeeId);

        if (employee != null)
        {
            SetEmployeeData(employee, record);

            ctx.Entry(employee).State = System.Data.Entity.EntityState.Modified;
        }
        else
        {
            employee = new bio_employee();
            employee.emp_id = employeeId;

            SetEmployeeData(employee, record);

            ctx.bio_employee.Add(employee);
        }


        if (count % batchSize == 0)
        {
            ctx.SaveChanges();
            ctx.Dispose();
            ctx = new DataContext();
        }

        count++;
    }
    ctx.SaveChanges();      //save any remaining
}

전문가 답변

Dapper는 데이터를 쿼리하는 여러 가지 방법을 제공하지만 ORM없이 일반적으로하는 것처럼 명령을 사용하는 것 외에는 저장 작업을 수행하지 않습니다.

그러나 제 3 자 라이브러리에서는 Dapper에 대한이 시나리오를 많이 다루고 있습니다.

면책 조항 : 저는 Dapper Plus 프로젝트의 소유자입니다.

Dapper Plus는 BulkInsert, BulkDelete, BulkUpdate 및 BulkMerge 작업을 제공하여 훨씬 빠른 라이브러리입니다. 수백만 개의 레코드가있는 시나리오를 쉽게 지원할 수 있습니다.

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Employee>()
                 .Table("Employee")
                 .Identity(x => x.EmployeeID);

// SAVE entity
connection.BulkMerge(employeeList);

편집 : 대답 subquestion

DapperPlus의 .BulkMerge가 Upsert를하고 있습니까?

예, BulkMerge는 upsert 작업입니다.

매핑 키를 사용하여 동일한 엔티티에 대해 둘 이상의 매핑을 지정할 수도 있습니다.

// Using key from database (x => x.EmployeeID)
DapperPlusManager.Entity<Employee>()
                 .Table("Employee");

connection.BulkInsert(employees);

// Using custom key
DapperPlusManager.Entity<Employee>("customKey")
                 .Table("Employee")
                 .Key(x => x.Code);

connection.BulkInsert("customKey", employees);


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow