gpt4 book ai didi

c# - “操作无法完成,因为 DbContext 已被释放。”

转载 作者:行者123 更新时间:2023-12-03 19:18:26 25 4
gpt4 key购买 nike

public ActionResult Index(FormModel form)
{
using (DBModels db = new DBModels())

{
var clients = from c in db.Clients
select c;

if (!String.IsNullOrEmpty(form.SearchString))
{
clients = clients.Where(s => s.Full_Name.Contains(form.SearchString) || s.Class.Contains(form.SearchString)
|| s.Membership_Type.Contains(form.SearchString) || s.Membership_Type.Contains(form.SearchString) ||
s.Notes.Contains(form.SearchString) || s.ClientID.Equals(form.SearchString));
}
if (form.IsChecked != null)
{
clients = clients.Where(t => t.Paid == form.IsChecked);
}
return View(clients);

}
}

不明白为什么会发生这个错误。我添加了一个搜索框来搜索数据库。我还添加了一个复选框来显示未付费的客户。当我改变
return View(clients); 

回到
return View(db.Client.ToList()); 

它有效,但这是我试图避免的,因为它显示了所有列表,而不是显示来自 SearchString 的变量的“客户端”变量。

最佳答案

clients是一个 IQueryable。在请求第一次迭代之前,IQueryable 不会枚举它的值。到那时,您的 DbContext 已经被释放,因此枚举会引发异常。

要解决这个问题,请使用类似

using (DBModels db = new DBModels())
{
var clients = Enumerable.Empty<Client>();

if (!String.IsNullOrEmpty(form.SearchString))
{
clients = db.Clients.Where(s => s.Full_Name.Contains(form.SearchString) || s.Class.Contains(form.SearchString)
|| s.Membership_Type.Contains(form.SearchString) || s.Membership_Type.Contains(form.SearchString) ||
s.Notes.Contains(form.SearchString) || s.ClientID.Equals(form.SearchString));
}

if (form.IsChecked != null)
{
clients = clients.Where(t => t.Paid == form.IsChecked);
}

return View(clients.ToList());
}

从理论上讲,在调用 ToList() 之前,您应该避免调用数据库,但我已经有一段时间没有走这条路了。相反,我建议使用 PredicateBuilder ,来自 LinqKit,构建一个将完全针对数据库运行的查询,如下所示:

using (DBModels db = new DBModels())
{
var predicate = PredicateBuilder.New<Client>(true);

if (!String.IsNullOrEmpty(form.SearchString))
{
predicate.And(s => s.Full_Name.Contains(form.SearchString) || s.Class.Contains(form.SearchString)
|| s.Membership_Type.Contains(form.SearchString) || s.Membership_Type.Contains(form.SearchString) ||
s.Notes.Contains(form.SearchString) || s.ClientID.Equals(form.SearchString));
}

if (form.IsChecked != null)
{
predicate.And(t => t.Paid == form.IsChecked);
}

return View(db.Clients.Where(predicate).ToList());
}

关于c# - “操作无法完成,因为 DbContext 已被释放。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979652/

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