来自实体框架的数据访问在调试期间有效,但在现场无效

daw*_*ode 2 c# linq asp.net entity-framework linq-to-sql

我的 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.....
   }
}
Run Code Online (Sandbox Code Playgroud)

这是在 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的 GPYouth 课程:

public partial class GPYouth
{
    public long YouthID { get; set; }
    public Nullable<long> GPID { get; set; }
    //Remaining Fields....
    public virtual Grampanchayat Grampanchayat { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ken*_*n2k 5

您正在处理您的实体上下文(感谢using),因此您不能Grampanchayat在之后延迟加载您的属性。

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

它可能适用于调试,因为Visual Studio 调试器本身会Grampanchayat在处理上下文之前尝试访问您的属性(例如,在监视窗口中显示它)。

对您的问题的正确纠正是急切加载(例如,参见此链接)您感兴趣的导航属性,然后处理上下文。您的所有GPYouth实例以及所有Grampanchayat导航属性都将通过一个查询从 DB 中获取。稍后您将不需要使用延迟加载来执行 SQL 请求。

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

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