gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:20 25 4
gpt4 key购买 nike

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

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

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;
});
}

最佳答案

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

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

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

关于c# - 将 Dbcontext 传递给正在处理的内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44757399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com