我还没有开始使用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
}
答案 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);