2017-10-15 108 views
0

我有這樣的方法,節省了與其相關的項目(多對一對多的關係)的實體,在調用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秒,這是一個很長的時間,我不明白我在這裏做錯了什麼..請幫助嗎?

回答

1

對於集合中的每一個項目,您都在查詢數據庫。我的建議是將記錄保存在var中,然後詢問變量是否在數據庫中。

var databaseRecords = oContext.TbHistoryLog_Lists.ToList(); 

然後在循環:

var record = databaseRecords.FirstOrDefault(x => x.ListObjectJson == ser); 
相關問題