将 Dbcontext 传递给正在处理的内部方法

Pass Dbcontext to inner method being disposed

首先 - 如果这是微不足道的,我们深表歉意。我做了一些搜索,但找不到任何特别相关的东西。我发现的几乎所有问题都与嵌套的 using 语句有关——这不适用于我的情况。

问题: 我有一个实例化我的 DbContext 实例的方法。然后将此实例传递给执行某些操作的私有方法,然后在外部方法中处理上下文。一旦我尝试在内部方法中使用上下文,我就会得到一个很好的旧异常:

The operation cannot be completed because the DbContext has been disposed

问题: 我错过了什么?上下文是如何处理的,有没有办法防止这种情况发生?从下面的代码中可以看出,我正在使用递归,因此在内部方法中创建 DbContext 可能不是一个好主意。

代码:

public static IEnumerable<Content> GetContent(int? parentId = null)
{
    using(DSSCMSContext context = new DSSCMSContext())
    {
        return context.Contents.Where(x => x.ParentId == parentId).ToList().Select(x => 
            {
                Content content = new Content(x);
                content.GetChildContent(context);
                return content;
            });          
    }
}

private void GetChildContent(DSSCMSContext context)
{
    Children = context.Contents.Where(x => x.ParentId == Id).ToList().Select(x =>
    {
        Content child = new Content(x);
        child.GetChildContent(context);
        return child;
    });
}
  public static IEnumerable<Content> GetContent(int? parentId = null)
    {
        using(DSSCMSContext context = new DSSCMSContext())
        {
            return context.Contents.Where(x => x.ParentId == parentId).ToList().Select(x => 
                {
                    Content content = new Content(x);
                    content.GetChildContent(context);
                    return content;
                });          
        }
    }

    private void GetChildContent(DSSCMSContext context)
    {
        Children = context.Contents.Where(x => x.ParentId == Id).ToList().Select(x =>
        {
            Content child = new Content(x);
            child.GetChildContent(context);
child.Dispose();
                return child;
            });
        }

你 return IEnumerable 来自 GetContent。这意味着你在 GetContent 中的最后一个 Select 不会立即执行(Select 是延迟计算的),它只会在某些东西枚举 GetContent 的结果时执行。但是当某些东西枚举 GetContent 的结果时——你的上下文已经被处理掉了。在那个 Select 里面你调用 content.GetChildContent(context)。此方法假定上下文是活动的,但它不是。

一个解决方法是在 return 从方法中枚举之前自己枚举结果:

return context.Contents.Where(x => x.ParentId == parentId).AsEnumerable().Select(x => 
{
     Content content = new Content(x);
     content.GetChildContent(context);
     return content;
}).ToList();