实体框架3.5:将对象分阶段保存到单独的上下文中
本文关键字:保存 单独 上下文 分阶段 对象 框架 实体 | 更新日期: 2023-09-27 18:20:07
在C#和实体框架3.5中,我有一个包含数百万条记录的上下文。这需要大约2 GB的RAM。我一调用SaveChanges()
,它就开始填充我的8GM RAM并开始交换。
我使用了一个探查器,结果发现是SQL查询占用了内存。
现在我想批量保存,但遇到了问题。
我有一个Locations
的集合(它又有一些东西的集合和子集合)。当我将其分为多个批次并为每个批次分配一个新上下文时,只要我执行context.AddToOrder(firstBatch)
,所有批次中的ALL位置就会突然具有实体状态Added
,即使它们没有Order
。这会导致保存失败,因为Order -> Location
关系不存在。
当我只向上下文中添加其中的一个子集时,为什么原始集合中的所有对象都会得到状态Added
?
我有一个有几百万张唱片的背景。这需要大约2 GB的RAM。
我知道你不会喜欢这个答案,但它很简单不要那样做EF,尤其是EFv1还没有做好准备。EF甚至不是处理数十MB的工具。对于这样的大数据集,您必须使用其他一些工具,或者将您的更新划分为多个(在您的情况下是数千甚至数百万)小更改集,每个更改集都使用自己的上下文。
我想,当您调用SaveChanges
EF时,它会尝试发挥它的魔力,包括检测实体中的更改和准备要执行的语句。可能存在内存泄漏,但由于GC的原因,也可能存在大量未释放的内存。在这种情况下,与您当前的问题无关。
Btw。EF将尝试将您的修改存储在单个交易中。因此,如果你试图在一笔交易中节省2GB,你可能会遇到更多层面的问题。