我是EF的新手,我正在将Windows服务应用程序转换为使用EF。它将读取一个包含11000名员工的文本文件,查看记录是否存在,然后插入或更新。
目前,我正在循环遍历每一行,创建一个带有值的新实体对象,将其传递给一个数据类,然后它会在其中查找实体,看看它是否会插入或更新。问题是我在调用上下文。SaveChanges()每个记录。
现在我想知道是否应该为所有员工创建一个实体列表。然后,我会将该列表发送到数据类中,循环浏览该列表,设置修改后的状态或附加,然后在浏览完整个列表后执行SaveChanges。这会起作用吗?它只调用一次插入/更新,还是仍然对所有记录进行11000次查询?
只是在寻找一种快速的方法。
foreach (string line in lines)
{
if (line.Trim().Length > 0)
{
SAP_DATES dateRecord = new SAP_DATES();
dateRecord.EMP = line.Substring(0, 8);
dateRecord.DATE_TYPE = line.Substring(10, 20);
dateRecord.DATE_VALUE = Convert.ToDateTime(line.Substring(30, 10));
dateRecord.DATE_MODIFIED = Convert.ToDateTime(line.Substring(40, 10));
Data.DataManager.ProcessDateRecord(dateRecord);
}
}
这在我的数据类中
public static void ProcessDateRecord(SAP_DATES dateRecord)
{
using (DataContext db = new DataContext())
{
var original = db.SAP_DATES.Find(dateRecord.EMP, dateRecord.DATE_TYPE);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(dateRecord);
}
else
{
db.SAP_DATES.Add(dateRecord);
}
db.SaveChanges();
}
}
这两种技术都会非常慢,但每X条记录使用SaveChanges可能会稍微提高性能。
为什么速度慢
- Find方法对每条记录执行数据库往返
- "添加"或"更新"为每条记录执行数据库往返
因此,如果你有11k条记录,你的两个解决方案都将使22k数据库往返,这太疯狂了。
免责声明:我是项目实体框架扩展的所有者
如果您真的在寻找更快的Upsert记录方法,这个库将使您的性能显著提高2000%甚至更多!
合并语句将更新现有记录并插入新记录。
using (DataContext db = new DataContext())
{
// Using EF Key
db.BulkMerge(list);
// Using a Custom Key
db.BulkMerge(list, ctx.BulkMerge(list,
operation => operation.ColumnPrimaryKeyExpression = date =>
new { date.EMP, date.DATE_TYPE });
}