实体框架的表现

时间:2016-05-13 07:43:11

标签: c# wpf performance entity-framework

我有一个使用EF的功能,但效果太慢了...... 你知道如何提高这个功能的性能吗?

public static void SaveCombiners()
    {
        using (var db = new IP_dbEntities())
        {
            db.COMBINERs.RemoveRange(db.COMBINERs);
            foreach (var type1 in EventTypesList)
            {
                foreach (var type2 in EventTypesList)
                {
                    db.COMBINERs.Add(new COMBINER()
                    {
                        EVENTS_TYPE = db.EVENTS_TYPE.Single(type => type.event_type == type1),
                        EVENTS_TYPE1 = db.EVENTS_TYPE.Single(type => type.event_type == type2),
                        combine_status = _eventTypesCombinerCollection[type1][type2].Value == true ? "+" : "-"
                    });
                }
            }
            db.SaveChanges();
        }
    }

2 个答案:

答案 0 :(得分:4)

您应该始终使用 AddRange 而不是添加。每次在AddRange上调用add方法时,Add方法将尝试DetectChanges。

public static void SaveCombiners()
{
    using (var db = new IP_dbEntities())
    {
        db.COMBINERs.RemoveRange(db.COMBINERs);

        List<COMBINER> list = new List<COMBINER>();

        foreach (var type1 in EventTypesList)
        {
            foreach (var type2 in EventTypesList)
            {
                list.Add(new COMBINER()
                {
                    EVENTS_TYPE = db.EVENTS_TYPE.Single(type => type.event_type == type1),
                    EVENTS_TYPE1 = db.EVENTS_TYPE.Single(type => type.event_type == type2),
                    combine_status = _eventTypesCombinerCollection[type1][type2].Value == true ? "+" : "-"
                });
            }
        }

        db.COMBINERs.AddRange(list);
        db.SaveChanges();
    }
}

话虽如此,您还面临另一个性能问题。

要删除或添加的每个记录都需要数据库往返。因此,如果删除10,000条记录并添加5,000条记录,则需要15,000次数据库往返,这非常慢。

免责声明:我是该项目的所有者Entity Framework Extensions

此库允许您在实体框架内执行批量操作。您只需通过“ BulkSaveChanges ”更改“SaveChanges”即可显着提高性能。

public static void SaveCombiners()
{
    using (var db = new IP_dbEntities())
    {
        db.COMBINERs.RemoveRange(db.COMBINERs);
        // ... code..
        db.COMBINERs.AddRange(list);

        db.BulkSaveChanges();
    }
}

答案 1 :(得分:0)

RemoveRange AddRange 太慢,请尝试 ExecuteSqlCommand

MyContext.Database.ExecuteSqlCommand("Delete from MyTable");