gpt4 book ai didi

c# - 来自 Entity Framework 的数据访问在调试期间有效,但在实时时无效

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

我的 Entityframework Web 应用程序遇到了独特的情况,我试图通过列表加载页面中的字段,但它一直在说“objectContext 实例已被处理,不能再用于需要连接的操作。”但是当我设置调试点并进入查看错误是什么时它工作正常吗??

这是我的代码:这是在我的页面加载事件下...

private void loadGPYouth()
{
List<GPYouth> leader = GPYouthLoader.getGPYouth(ViewState["LeaderID"].ToString());
foreach (var item in leader)
{
ddlConstituency.SelectedValue = item.Grampanchayat.ConstituencyID.ToString();
ddlMandal.SelectedValue = item.Grampanchayat.MandalID.ToString();
//filling remaing fields.....
}
}

这是在 GPYouthLoader 类下:

public static List<GPYouth> getGPYouth(string LeaderID)
{
List<GPYouth> list = new List<GPYouth>();
using (var db = new TDPMADANEntities())
{
int _id = Convert.ToInt32(LeaderID);
var query = (from b in db.GPYouths where b.YouthID == _id select b).ToList();
list = query.ToList();
}
return list;
}

这是我的 GPYouth 类(class):

public partial class GPYouth
{
public long YouthID { get; set; }
public Nullable<long> GPID { get; set; }
//Remaining Fields....
public virtual Grampanchayat Grampanchayat { get; set; }
}

最佳答案

你正在处理你的实体上下文(感谢 using),所以 你不能延迟加载你的 Grampanchayat 属性.

请记住,延迟加载需要对数据库执行新的 SQL 请求,因此如果您与数据库的连接关闭(也就是说,因为您释放了上下文),您将无法再延迟加载任何内容。

它可能在调试中工作,因为 Visual Studio 调试器本身 会在处理上下文之前尝试访问您的 Grampanchayat 属性(例如,在 Watch 窗口中显示它).

对您的问题的正确修正是预先加载您感兴趣的导航属性(例如参见 this link ),然后 处理上下文。您所有的 GPYouth 实例以及您所有的 Grampanchayat 导航属性都将在一次查询中从数据库中获取。您以后不需要使用延迟加载来执行 SQL 请求。

不要让一个实体上下文不被释放,尽量缩短它的生命周期。一旦你完成了它,就把它处理掉。如果之后出现任何问题,您就会知道您忘记了急切加载导航属性。

附带说明,我个人认为使用延迟加载是一种不好的做法。恕我直言,要点是:如果使用不当(通常是这种情况),性能很差,异常管理失败(因为您可能无法在数据库上执行 SQL 任何地方 是您的代码,而不仅仅是在 DAL 中).我会禁用它以避免将来出现类似问题。

关于c# - 来自 Entity Framework 的数据访问在调试期间有效,但在实时时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760541/

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