在调用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();
}
我有两个表:TbCommonHistoryLog
,TbCommonHistoryLog_Lists
,这是多对多的关系,结合表是TbCommonHistoryLogDetails
, 我在这里做的是一个主 - 细节模型的审计,所有的审计都被序列化为DB中的JSON,我将头对象保存在TbCommonHistoryLog
表中,并且每个列表项在TbHistoryLog_Lists
表中,方法上面我检查列表项是否已经存在于数据库中,以避免重复。 但这个过程需要超过15秒,这是一个很长的时间,我不明白我在这里做错了什么..请帮助吗?
答
对于集合中的每一个项目,您都在查询数据库。我的建议是将记录保存在var中,然后询问变量是否在数据库中。
var databaseRecords = oContext.TbHistoryLog_Lists.ToList();
然后在循环:
var record = databaseRecords.FirstOrDefault(x => x.ListObjectJson == ser);