2015-11-02 18 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