Dapper插入还是更新?

时间:2016-06-30 15:46:53

标签: 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
}

1 个答案:

答案 0 :(得分:6)

Dapper提供了多种查询数据的方法,但没有一种方法可以执行保存操作,除了使用像往常一样没有ORM的命令。

然而,许多第三方库涵盖了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);

编辑:回答子问题

  

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);