实体框架的最佳更新性能

时间:2015-11-02 07:25:47

标签: c# entity-framework entity-framework-6

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

2 个答案:

答案 0 :(得分:0)

EF在SaveChanges上为对象上的每个数据操作创建一个单独的查询。即使删除多个对象也会导致创建多个DELETE查询。您可以使用async/await

来改善UI响应时间
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