在迭代通过等待ToListAsync获取的列表时处理DbContext

时间:2015-08-03 07:59:42

标签: c# entity-framework asynchronous async-await

在我的EF存储库中给出以下代码:

IRepository
{
    Task<IEnumerable<MyEntity>> GetEntities(Func<IQueryable<MyEntity>, IQueryable<);
}

EFRepository : IRepository
{
    public async Task<IEnumerable<MyEntity>> GetEntities(Func<IQueryable<MyEntity>, IQueryable<MyEntity>> projection)
    {
        using (var context = new MyDbContext())
        {
            var query = context.MyEntities
                .Include(e => e.RelatedEntity);
            return await projection(query).ToListAsync();
        }
    }
}

在我使用repo的服务层中的类似内容(服务层在实际案例中有一些验证和过滤)

public async Task<IEnumerable<MyEntity>> GetEntities()
{
    // _repo is constructor injected
    // In this example, we just add a simple filter, but in the actual
    // code the query is built based on several input parameters
    return await _repo.GetEntities(query => query.Where(entity => entity.SomeProperty == "SomeValue"));
}

在等待服务层的任务后,我正在ObjectContextDisposed内进行迭代,我得到IEnumerable<MyEntity>

我的印象是,对.ToListAsync()的调用实际上会确保从数据库中提取集合并在返回时准备好使用,就像ToList同步一样。

我还尝试在查询中添加.AsNoTracking(),但我收到同样的错误。

我对.ToListAsync()的假设是否不正确?

0 个答案:

没有答案