2015-11-02 31 views
0

我正在使用实体框架6.1.3。 我有一个ob对象列表(像数据库表一样的属性) 如何在执行更新语句时达到最佳性能?最佳更新性能与实体框架

在执行任何插入操作时,我可以使用AddRange()方法插入列表的所有项目。在更新语句中是否有这样做的可能性?

此刻,我会做就行了一个foreach,然后我调用Update方法:

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

也许你可以检查[这](https://efbulkinsert.codeplex.com/)或只是谷歌BULK INSERT在EF – LiranBo

+0

插入表现还算可以,只是期待,以提高更新性能:) – Fabian

+0

你有没有试过在foreach之外调用SaveChanges,即逻辑工作单元。 –

回答

0

EF创建于SaveChanges为对象进行单独查询每个数据操作。即使删除多个对象也会导致创建多个DELETE查询。您可以通过使用async/await改进UI响应时间:

public async Task UpdateZeitenPaar() 
{ 
    var paar = await db.pc_d_zeiten_paar.SingleOrDefaultAsync(...); 
    // [...] 
    await db.SaveChangesAsync(); 
} 
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 
+0

如果我尝试一下你的建议,我会得到一个错误。它说:“无法创建一个类型为”PROCESSPC_Core.DAL.pc_d_saldenverwaltung“的常量值。在这种情况下,只支持原始类型或枚举类型。” – Fabian