重置上下文并访问上一个查询

时间:2014-01-13 22:59:18

标签: c# linq entity-framework dbcontext

我正在处理大量数据。为了加快EF,我发现在块中调用SaveChanges()有帮助。此外,我读到每隔一段时间重置上下文也会加快速度。我无法实现这一点。

context = new Context();
List<object> results = context.someQuery.ToList();
// do stuff to results to get it ready for processing in the for loop

for (int i = 0; i < results.Count; i++)
{
    // do stuff like Add and Modify
    if (results[i] == target)
        context.myDataSet.DeleteObject(target);
    if (i % 10 == 0)
        context.SaveChanges();
    if (i % 100 == 0)
    {
        context.Dispose();
        context = new Context();
    }
} 

重置上下文后似乎DeleteObject()无效。我能做些什么才能让这些方面有所作为呢?我真的不想重新查询数据库(即,将查询移动到for循环中并在每次重置上下文时再次执行),因为我对它进行了大量的预处理并且不需要#39 ;我想继续重复这个。

2 个答案:

答案 0 :(得分:0)

尝试

using(var context = new Context())
{
    context.Entry(new Entity { Id = 5} ).State = Deleted;
    context.SaveChanges();
}

答案 1 :(得分:0)

我认为你可以使用交易(或工作单位模式作为更好的解决方案)处理这个问题:

context = new Context();
var transaction = context.Database.BeginTransaction();
List<object> results = context.someQuery.ToList();
// do stuff to results to get it ready for processing in the for loop

for (int i = 0; i < results.Count; i++)
{
    // do stuff like Add and Modify
    if (results[i] == target)
        context.myDataSet.DeleteObject(target);
    if (i % 10 == 0)
        context.SaveChanges();
    if (i % 100 == 0)
    {
        transaction.Commit();
        transaction.BeginTransaction();
    }
}

如果您的查询出错,是否必须回滚?如果是,请查看Unit of Work pattern