Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架3.5:使用单独的上下文分阶段保存对象_C#_Entity Framework - Fatal编程技术网

C# 实体框架3.5:使用单独的上下文分阶段保存对象

C# 实体框架3.5:使用单独的上下文分阶段保存对象,c#,entity-framework,C#,Entity Framework,在C#和实体框架3.5中,我有一个包含数百万条记录的上下文。这需要大约2GB的RAM。我一调用SaveChanges(),它就开始填满我的8 GM内存并开始交换 我使用了一个分析器,结果发现占用内存的是SQL查询 现在我想分批保存,但遇到了问题 我有一个位置的集合(这些位置又有东西的集合和子集合)。当我将其拆分为多个批次并为每个批次分配新的上下文时,只要我执行context.AddToOrder(firstBatch),所有批次中的所有位置都会突然添加实体状态,,即使它们没有顺序。这会导致保存失

在C#和实体框架3.5中,我有一个包含数百万条记录的上下文。这需要大约2GB的RAM。我一调用
SaveChanges()
,它就开始填满我的8 GM内存并开始交换

我使用了一个分析器,结果发现占用内存的是SQL查询

现在我想分批保存,但遇到了问题

我有一个
位置的集合
(这些位置又有东西的集合和子集合)。当我将其拆分为多个批次并为每个批次分配新的上下文时,只要我执行
context.AddToOrder(firstBatch)
,所有批次中的所有位置都会突然添加实体状态
,即使它们没有
顺序
。这会导致保存失败,因为
Order->Location
关系不存在

当我只将原始集合中的一个子集添加到上下文中时,为什么原始集合中的所有对象都会得到state
Added

我有几百万条记录。这需要大约2GB的RAM

我知道你不会喜欢这个答案,但它很简单不要这样做。EF,尤其是EFv1还没有准备好。EF甚至不是处理数十兆字节的工具。对于这样的大数据集,您必须使用其他一些工具,或者使用自己的上下文将更新划分为多个(在您的情况下是数千甚至数百万)小更改集

我猜当您调用
SaveChanges
EF时,它会尝试发挥它的魔力,包括检测实体中的更改并准备要执行的语句。可能存在内存泄漏,但由于GC,也可能存在大量未释放的内存。在这种情况下,与您当前的问题无关


顺便说一句,EF将尝试在单个事务中存储您的修改。因此,如果您试图在单个事务中节省2GB,您可能会在更多级别上遇到问题

您确定应用程序已经使用了所有内存吗?或者可能是Sql Server使用的。所有Sql查询字符串都必须在某个地方生成,我猜那将是ram。只保存它的一部分怎么样,也许使用事务作用域。它不是SQL server,而是另一台机器。交易范围;这可能是有可能的,但上一次我尝试(几周前),它需要在服务器上设置很多奇怪的设置,我停止了它。它需要重新启动,而我现在无法重新启动服务器。无论如何,在查看活动监视器之后,SQL在使用RAM时确实还没有被执行。您肯定应该按块保存数据。只在RAM中保存大量数据是不安全的,因为如果系统崩溃,任何东西都会丢失。交易应该运作良好。安全不是问题;我从头开始生成这些记录,然后保存它们。这是因为调用Add将在对象图中添加所有内容,而不仅仅是单个位置。所以,如果您的位置具有stuff的导航属性,那么也会添加stuff,如果stuff具有位置的导航集合,那么也会添加所有位置。划分它并不那么容易。当您已经有2GB的互连对象时,它将不起作用。你必须分批处理对象,并且只建立该批中存在的关系;一个位置和它的“东西”应该是完全独立的。但我会再检查一次以确定。