簡體   English   中英

實體框架的最佳更新性能

[英]Best Update Perfomance with Entity Framework

我正在使用Entity Framework 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();
    }

EF為每個對象上的數據操作在SaveChanges創建一個單獨的查詢。 甚至刪除多個對象也會導致創建多個DELETE查詢。 您可以使用async/await縮短UI響應時間:

public async Task UpdateZeitenPaar()
{
    var paar = await db.pc_d_zeiten_paar.SingleOrDefaultAsync(...);
    // [...]
    await db.SaveChangesAsync();
}

您在每次更新調用中都得到該項目,這很可能是您的問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM