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

问题描述:

我有这样的方法,节省了与其相关的项目(多对一对多的关系)的实体,在调用SaveChanges()之前,添加或更新foreach循环中的实体需要很长时间?

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表中,并且每个列表项在TbHistoryLog_Lists表中,方法上面我检查列表项是否已经存在于数据库中,以避免重复。 但这个过程需要超过15秒,这是一个很长的时间,我不明白我在这里做错了什么..请帮助吗?

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

var databaseRecords = oContext.TbHistoryLog_Lists.ToList(); 

然后在循环:

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