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)
您正在处理您的实体上下文(感谢using),因此您不能Grampanchayat在之后延迟加载您的属性。
请记住,延迟加载需要对数据库执行新的 SQL 请求,因此如果您与数据库的连接已关闭(即,因为您处理了上下文),您将无法再延迟加载任何内容。
它可能适用于调试,因为Visual Studio 调试器本身会Grampanchayat在处理上下文之前尝试访问您的属性(例如,在监视窗口中显示它)。
对您的问题的正确纠正是急切加载(例如,参见此链接)您感兴趣的导航属性,然后处理上下文。您的所有GPYouth实例以及所有Grampanchayat导航属性都将通过一个查询从 DB 中获取。稍后您将不需要使用延迟加载来执行 SQL 请求。
不要让实体上下文没有被释放,尽量缩短它的生命周期。一旦你完成了它,处理它。如果之后出现任何问题,您就会知道您忘记了急切加载导航属性。
作为旁注,我个人认为使用延迟加载是一种不好的做法。恕我直言,要点是:如果使用不当,性能会很差(通常是这种情况),异常管理损坏(因为您可能无法在您的数据库上执行 SQL 的任何地方都是您的代码,而不仅仅是在 DAL 中)。我会禁用它以避免将来出现类似问题。
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |