我有这种方法可以保存实体及其相关项目(多对多关系),
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
表中,以及{{1}中的每个列表项} table,在上面的mthod我检查列表项是否已经存在于数据库中,以避免重复。
但这个过程需要15秒以上,这是一段很长的时间,我无法弄清楚我在这里做错了什么..请帮帮忙?
答案 0 :(得分:1)
对于集合中的每个项目,您都在查询数据库。我的建议是在var中保存记录,然后询问变量该项是否在数据库中。
var databaseRecords = oContext.TbHistoryLog_Lists.ToList();
然后在循环中:
var record = databaseRecords.FirstOrDefault(x => x.ListObjectJson == ser);