这是我目前正在处理的以下设置:
UpdateList()
函数更新列表的字段或为DbContext中的此表或其他表创建新记录Process_Failure()
函数中,我有一个整个列表的单个上下文实例Process_Success()
函数中,我将while
- 循环移到了上下文之外private void Process_Success()
{
var totalProcessedCounter = 0;
while( true )
{
using( var context = new MyDbContext() )
{
var list = context.MyClass.OrderBy( x => x.Id )
.Skip( totalProcessedCounter ).Take( 1000 )
.ToList();
if( !list.Any() )
break;
UpdateList( list );
totalProcessedCounter += list.Count;
}
}
}
private void Process_Failure()
{
var totalProcessedCounter = 0;
using( var context = new MyDbContext() )
{
while( true )
{
var list = context.MyClass.OrderBy( x => x.Id )
.Skip( totalProcessedCounter ).Take( 1000 )
.ToList(); // throws OutOfMemoryException
if( !list.Any() )
break;
UpdateList( list );
totalProcessedCounter += list.Count;
}
}
}
private void UpdateList( List<MyClass> list )
{
var doSaveChanges = false;
list = list.Where( x => SomeFilter( x ) ).ToList();
using( var context = new MyDbContext() )
{
foreach( var item in list )
{
ChangeItem( item );
}
if( doSaveChanges )
context.SaveChanges();
}
}
当我在context
的嵌套功能调用中创建另一个实例时,获取UpdateList()
以某种方式被污染/填充?
答案 0 :(得分:2)
你得到异常的原因是因为DbContext
缓存了the data you read from DB,所以如果你继续向其缓存中添加实体,你会在某些时候炸掉你的内存,你会得到{{1 }}。 GC不会清除实体,因为OutOfMemoryException
引用了实体。
尝试使用DbContext
:
.AsNoTracking()
但是,如果您不跟踪实体,请更新它们is more difficult(读取“将现有实体附加到上下文”),因为这些实体不属于任何上下文且未被跟踪。
我不会像这样使用EF,这看起来像UPDATE / SELECT SQL语句的一个很好的任务。