我是EF的新手,我将Windows服务应用转换为使用EF。它将读取一个包含11k名员工的文本文件,并查看是否存在记录,并进行插入或更新。
目前,我循环遍历每一行,使用值创建一个新的实体对象,将其传递给数据类,然后在那里查找实体以查看它是否会插入或更新。我正在调用context.SaveChanges()每个记录。
现在我想知道是否应该为所有员工创建一个实体列表。然后我将该列表发送到数据类,循环遍历列表,设置修改后的状态或附加,然后在我完成整个列表后执行SaveChanges。这会工作,它只会调用插入/更新一次,还是仍然会查询11k次所有记录?
只是寻找快速的方法来做到这一点。
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();
}
}
答案 0 :(得分:1)
这两种技术都会非常慢,但每次X记录使用SaveChanges可能会稍微改善性能。
为什么慢?
因此,如果您有11k记录,那么您的两个解决方案都将使22k数据库往返变得疯狂。
免责声明:我是该项目的所有者Entity Framework Extensions
如果您真的在寻找更快的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 });
}