C# 从实体框架进行的数据访问在调试期间有效,但在实时环境下无效
我在Entityframework web应用程序中遇到了一个独特的情况,我试图通过列表加载页面中的字段,但它一直在说 “objectContext指令已被释放,不能再用于需要连接的操作。” 但是,当我设置调试点并进入以查看错误是什么时,它工作正常 这是我的代码:这是在我的页面加载事件下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"
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中)。我会禁用它以避免将来出现类似问题。这与懒散地加载子实体有关吗?