尽管在using语句中调用了ToList,但DbContext已被释放

时间:2016-10-20 15:18:35

标签: c# entity-framework linq

我看到操作无法完成,因为已经处理了DbContext。异常消息,即使代码通过返回 List< T> 来使用预先加载。我在 EntityRepository 类中有以下代码:

public List<Entity> GetEntityByProperty(string property)
{
    using (AppDbContext appDbContext = GetContext())
    {
        List<Entity> entities = appDbContext.Entities
            .Where(e => e.Property == property)
            .ToList();

        return entities;
    }
}

这又是从Web服务类调用的:

private static EntityRepository EntityRepositoryStatic = new EntityRepository();

[WebMethod]
public List<Entity> GetEntityByProperty(string property)
{
    return EntityRepositoryStatic.GetEntityByProperty(property);
}

EntityRepository 继承自存储库基类,该基类实现 IDisposable (用于处置上下文)并使用此代码返回实例背景:

private AppDbContext appDbContext;

public AppDbContext GetContext()
{
    if (appDbContext == null)
    {
        appDbContext = new AppDbContext();
    }

    return appDbContext;
}

在存储库中调用 appDbContext 的行上抛出异常。我错过了一些明显的东西吗?

这是一个很大的遗留代码库,因此我们只是尝试通过调用存储库类来替换对Web服务中的上下文的内联调用。

1 个答案:

答案 0 :(得分:1)

第一次拨打GetContext()时,您会创建一个新的上下文,然后将其返回,然后使用和处理它。然后,对GetContext()的下一次调用将返回原始的,已经处置的上下文,并且您会收到错误。如果你想重复使用它,你就不能处理它;如果你想在完成后处理它,你就无法重复使用它。