Entity framework 表中的Foreach循环似乎加载了每一行并耗尽了内存

Entity framework 表中的Foreach循环似乎加载了每一行并耗尽了内存,entity-framework,entity-framework-6,entity-framework-6.1,Entity Framework,Entity Framework 6,Entity Framework 6.1,我正在尝试使用EF版本6.1.1在C中使用实体框架转储数据库表。 我希望foreach循环一次加载每一行,但它会逐渐加载每一行,然后耗尽内存 foreach (Quote L in context.Quotes) sw.WriteLine( "INSERT INTO [dbo].[Quote] ([QuoteId], [BookId], [VerbTenseId], [Form], [Quotation]) VALUES (%1,%2,%3,N'%4',N'%5')",

我正在尝试使用EF版本6.1.1在C中使用实体框架转储数据库表。 我希望foreach循环一次加载每一行,但它会逐渐加载每一行,然后耗尽内存

foreach (Quote L in context.Quotes)
    sw.WriteLine(
        "INSERT INTO [dbo].[Quote] ([QuoteId], [BookId], [VerbTenseId], [Form], [Quotation]) VALUES (%1,%2,%3,N'%4',N'%5')", 
        L.QuoteId, L.BookId, L.VerbTenseId, L.Form, L.Quotation);
在上面的代码中,context是一个DatabaseContext,它已经初始化到我的数据库中,Quotes是有效的Quote记录表。我正试图将每条记录转储到一个文件中进行备份。 显然,正如前面所建议的,我可以放弃实体框架,使用DataReader来迭代数据库表,但该框架确实允许迭代太大而无法放入内存的表

是否有一种优雅的方式,也许在某个地方有一个标志,可以允许这样做

通常情况下,结果集很小,只有几千个,但在这种情况下,结果集会达到数百万个

在以前的框架版本中似乎有一些选项可以使用,但是,除非我有误解,否则这些方法和标志将不再存在

这只是测试代码,不是常规的数据库备份。我不是在寻找更好的方式来表达我的代码。我正在寻找一种优雅的方式来使用EF。如果EF只是缺少这样的支持,那就是我的答案


请不要弄乱这个示例,只要回答是否有一种方法可以使用EF枚举数据库表,而无需将每一行加载到内存中并保持在内存中。我可以编写其他示例,并提供其他选项来实现数据库备份。这只是一个示例。

我还没有测试它,但请在context.Quotes.AsNoTracking{…}中尝试使用每个引号L。AsNoTracking不应该将实体放在缓存中,所以我假设当它们超出范围时,GC将使用它们


另一种方法是实施批处理选择前N个实体,处理,选择下一个前N个。在这种情况下,请确保每次迭代都处理并创建新的上下文,并在查询中使用适当的OrderBy。

旁注:我希望您的报价中没有任何撇号。如果您需要备份数据库,为什么不使用真正的备份工具来备份数据库呢?这是使用字符串格式还是ef上下文?ef从中取出整个结果集并混合对象实例。它不是一次一行的光标。听起来您必须切换到原始ADO.NET并使用DataReader。关闭更改跟踪可能会有所帮助。从我看到的情况来看,上下文保存在每条记录上,假设您可以更改一条记录,然后调用savechanges。如果不跟踪更改,它可能会随着内存使用量的增加而释放缓存。