我正在使用Entity Framework 6.1.3。 我有一个列表ob对象(与数据库表相同的属性) 如何在执行更新语句时达到最佳性能?
在执行任何Insert操作时,我可以使用AddRange()方法插入List的所有项目。是否有可能在更新语句中执行此操作?
在片刻我会在列表上做一个foreach,然后我调用更新方法:
public void UpdateZeitenPaar(int? pc_c_mandant_id, int? pc_d_zeiten_id, int pc_d_zeiten_paare_id, string personalnummer, DateTime? kommZeit, DateTime? gehZeit, int? kommID, int? gehID, decimal? zeitIst, decimal? zeitPause, int? pc_d_aktivitaet_id, DateTime? datum)
{
pc_d_zeiten_paare paar = db.pc_d_zeiten_paare.SingleOrDefault(p => p.pc_c_mandant_id == pc_c_mandant_id && p.pc_d_zeiten_paare_id == pc_d_zeiten_paare_id);
paar.datum = datum;
paar.gehZeit = gehZeit;
paar.geh_pc_d_buchungsdaten_id = gehID;
paar.kommZeit = kommZeit;
paar.komm_pc_d_buchungsdaten_id = kommID;
paar.pc_c_mandant_id = pc_c_mandant_id;
paar.pc_d_aktivitaet_id = pc_d_aktivitaet_id;
paar.pc_d_zeiten_id = pc_d_zeiten_id;
paar.personalnummer = personalnummer;
paar.zeitIst = zeitIst;
paar.zeitPause = zeitPause;
db.SaveChanges();
}
答案 0 :(得分:0)
EF在SaveChanges
上为对象上的每个数据操作创建一个单独的查询。即使删除多个对象也会导致创建多个DELETE
查询。您可以使用async/await
:
public async Task UpdateZeitenPaar()
{
var paar = await db.pc_d_zeiten_paar.SingleOrDefaultAsync(...);
// [...]
await db.SaveChangesAsync();
}
答案 1 :(得分:0)
您在每次更新通话时都收到该项目,这很可能是您的问题。
pc_d_zeiten_paare paar = db.pc_d_zeiten_paare.SingleOrDefault(p => p.pc_c_mandant_id == pc_c_mandant_id && p.pc_d_zeiten_paare_id == pc_d_zeiten_paare_id);
您最有可能使用foreach调用此方法来遍历您的项目,并在某些集合中使用id参数。您可以尝试将所有实体一次性加载到要更新的内存中。
// This will load all the instances to the context, so they are already in the memory and no round trip to db is required
// Assuming your myItemList is the list that contains your item types and the id's of the items you are going to update
var materializedList = db.pc_d_zeiten_paare.Where(p => myItemList.Any(myp => myp.pc_d_zeiten_paare_id == p.pc_d_zeiten_paare_id).ToList();
// do your normal update logic here