将 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();
首先 - 如果这是微不足道的,我们深表歉意。我做了一些搜索,但找不到任何特别相关的东西。我发现的几乎所有问题都与嵌套的 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();