【问题标题】:Data Access from Entity framework works during debugging but not on live实体框架的数据访问在调试期间有效,但在实时时无效
【发布时间】:2013-12-24 11:59:41
【问题描述】:

我在我的 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 课程:

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

【问题讨论】:

  • 这与延迟加载子实体有关吗?

标签: c# asp.net linq entity-framework linq-to-sql


【解决方案1】:

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

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

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

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

不要让实体上下文不被释放,尽量缩短它的生命周期。完成后,将其丢弃。如果之后出现任何问题,您就会知道您忘记了预先加载导航属性。

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

【讨论】:

    【解决方案2】:

    在我的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多