gpt4 book ai didi

c# - 错误 : DbContext has been disposed

转载 作者:行者123 更新时间:2023-11-30 21:47:11 25 4
gpt4 key购买 nike

public JsonResult JTask(int id)
{
using (TestDb db = new TestDb())
{
var a = db.ToDos.Where(todo => todo.UserId == id);
return Json(a, JsonRequestBehavior.AllowGet);
}
}

我在返回 JsonResult 时遇到问题当我运行这段代码代码时,我得到了错误

"The operation cannot be completed because the DbContext has been disposed."

我尝试按照建议在第 3 行的末尾添加 .ToList(),但随后出现错误

"A circular reference was detected while serializing an object of type System.Data.Entity.DynamicProxies."

最佳答案

不是很明显,但是内置Json方法仅在 JTask 之后进行序列化方法执行完毕。到那时,当然,上下文已经被处理,导致您描述的原始错误。

如果你有一个 ICollection<TodoItem>你里面的属性(property)Todo类,每个都有一个 ToDo属性,它是对父级的引用。而每一个ToDo属性也将有 ICollection<TodoItem> children,它再次返回给 parent 的引用,依此类推。这可能会无限循环,并且当序列化程序尝试序列化对象时,它会因循环引用错误而放弃。

同时解决这两个问题的一种方法是使用 View 模型。 View 模型是一个中间类,它只包含模型类所具有的属性的一个子集。典型的流程是首先将模型类转换为 View 模型,然后将 View 模型序列化为 json:

var viewModels = new List<TodoViewModel>();

using (TestDb db = new TestDb())
{
var todoModels = db.ToDos.Where(todo => todo.UserId == id).ToList();

foreach (var model in todoModels)
{
var todoViewModel = new TodoViewModel
{
// Populate viewmodel properties here
Text = model.Text
};

viewModels.Add(todoViewModel);
}
}

return Json(viewModels, JsonRequestBehavior.AllowGet);

我写了一篇关于使用 View 模型的优势的博文。如果您有兴趣,可以在这里查看:Why Use ViewModels

关于c# - 错误 : DbContext has been disposed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38693794/

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