C# 从实体框架进行的数据访问在调试期间有效,但在实时环境下无效

C# 从实体框架进行的数据访问在调试期间有效,但在实时环境下无效,c#,asp.net,linq,entity-framework,linq-to-sql,C#,Asp.net,Linq,Entity Framework,Linq To Sql,我在Entityframework web应用程序中遇到了一个独特的情况,我试图通过列表加载页面中的字段,但它一直在说 “objectContext指令已被释放,不能再用于需要连接的操作。” 但是,当我设置调试点并进入以查看错误是什么时,它工作正常 这是我的代码:这是在我的页面加载事件下 private void loadGPYouth() { List<GPYouth> leader = GPYouthLoader.getGPYouth(ViewState["LeaderID"

我在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.....
   }
}
private void loadGPYouth()
{
List leader=GPYouthLoader.getGPYouth(ViewState[“LeaderID”].ToString());
foreach(leader中的var项)
{
ddlconstruction.SelectedValue=item.Grampanchayat.constructionId.ToString();
ddlMandal.SelectedValue=item.Grampanchayat.MandalID.ToString();
//正在填充剩余字段。。。。。
}
}
这在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;
}
公共静态列表getGPYouth(字符串LeaderID)
{
列表=新列表();
使用(var db=new tdpmadantities())
{
int _id=Convert.ToInt32(LeaderID);
var query=(从db.gpyourts中的b开始,其中b.YouthID==_id选择b);
list=query.ToList();
}
退货清单;
}
这是我的青年班:

public partial class GPYouth
{
    public long YouthID { get; set; }
    public Nullable<long> GPID { get; set; }
    //Remaining Fields....
    public virtual Grampanchayat Grampanchayat { get; set; }
}
公共部分类
{
公共long YouthID{get;set;}
公共可为空的GPID{get;set;}
//剩余字段。。。。
公共虚拟Grampanchayat Grampanchayat{get;set;}
}

在我的GPYouthLoader类中,我取出了using语句,它开始正常工作

public static List<GPYouth> getGPYouth(string LeaderID)
{
  List<GPYouth> list = new List<GPYouth>();
  int _id = Convert.ToInt32(LeaderID);
  var db = new TDPMADANEntities();
  var query = (from b in db.GPYouths where b.YouthID == _id select b).ToList();
  list = query.ToList();
  // You could directly set list = (from b....).ToList(); instead of list=query.ToList();
  return list;
}
公共静态列表getGPYouth(字符串LeaderID)
{
列表=新列表();
int _id=Convert.ToInt32(LeaderID);
var db=新的TDPMADANEntities();
var query=(从db.gpyourts中的b开始,其中b.YouthID==_id选择b);
list=query.ToList();
//您可以直接设置list=(从b…).ToList();而不是list=query.ToList();
退货清单;
}

您正在处理您的实体上下文(多亏了
使用的
),因此您不能延迟加载
Grampanchayat
属性

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

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

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

不要让实体上下文不被处理,尽量缩短其生存期。一旦你用完了,就把它处理掉。如果之后出现任何问题,您将知道您忘记加载导航属性


顺便说一句,我个人认为使用延迟加载是一种不好的做法。IMHO的要点是:如果没有正确使用,性能会很糟糕(通常情况下),异常管理会中断(因为您可能无法在数据库上执行SQL,无论您的代码在哪里,而不仅仅是在DAL中)。我会禁用它以避免将来出现类似问题。

这与懒散地加载子实体有关吗?