在调用SaveChanges()之前,在foreach循环中添加或更新实体需要很长时间?

时间:2017-10-15 09:29:52

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

我有这种方法可以保存实体及其相关项目(多对多关系),

private static void Save<T>(TbCommonHistoryLog log, List<T> lstDetails) where T : IHasSerial
{   
    foreach (var item in lstDetails.OrderBy(x => x.Serial))
    {
        var ser = SerializeObject(item);
        var record = oContext.TbHistoryLog_Lists.FirstOrDefault(x => x.ListObjectJson == ser);
        if (record == null) //add new list item
        {
            TbCommonHistoryLog_Lists listObject = new TbCommonHistoryLog_Lists()
            {
                ListObjectJson = SerializeObject(item)
            };
            var details = new TbCommonHistoryLogDetails { TbHistoryLog = log, TbHistoryLog_Lists = listObject };
            oContext.TbHistoryLogDetails.Add(details);
        }
        else //attach an existing list item
        {
            var o = oContext.TbHistoryLog_Lists.Find(record.Id);
            oContext.TbHistoryLog_Lists.Attach(o);
            var details = new TbCommonHistoryLogDetails { TbHistoryLog = log, TbHistoryLog_Lists = o };
            oContext.TbHistoryLogDetails.Add(details);
        }
    }
    oContext.BulkSaveChanges();
}

我有两个表:TbCommonHistoryLogTbCommonHistoryLog_Lists,它们有多对多关系,加入表为TbCommonHistoryLogDetails, 我在这里做的是对主 - 详细模型进行审计,所有审计都在DB中序列化为JSON,我将头对象保存在TbCommonHistoryLog表中,以及{{1}中的每个列表项} table,在上面的mthod我检查列表项是否已经存在于数据库中,以避免重复。 但这个过程需要15秒以上,这是一段很长的时间,我无法弄清楚我在这里做错了什么..请帮帮忙?

1 个答案:

答案 0 :(得分:1)

对于集合中的每个项目,您都在查询数据库。我的建议是在var中保存记录,然后询问变量该项是否在数据库中。

var databaseRecords = oContext.TbHistoryLog_Lists.ToList();

然后在循环中:

var record = databaseRecords.FirstOrDefault(x => x.ListObjectJson == ser);