C# ObjectContext实例已被释放,无法再使用
这个问题我已经被问过无数次了,但我遇到的每一个建议我似乎都已经涵盖了 我的MVC解决方案中有实体框架,我有一个“存储库”,试图检索C# ObjectContext实例已被释放,无法再使用,c#,asp.net-mvc,entity-framework,dispose,C#,Asp.net Mvc,Entity Framework,Dispose,这个问题我已经被问过无数次了,但我遇到的每一个建议我似乎都已经涵盖了 我的MVC解决方案中有实体框架,我有一个“存储库”,试图检索MyObjects的集合: public static List<MyObject> GetMyObjects() { using (var context = new MyEntities()) { return context.MyObjects.Include("Contact").OrderByDescending(o =
MyObject
s的集合:
public static List<MyObject> GetMyObjects()
{
using (var context = new MyEntities())
{
return context.MyObjects.Include("Contact").OrderByDescending(o => o.Date).ToList();
}
}
我得到以下错误:
ObjectContext实例已被释放,无法再用于需要连接的操作。
我不知道在哪里打开这个,我很欣赏实体框架“延迟加载”关系数据集,如果需要的话,我也很欣赏尝试序列化整个集合确实会尝试加载这些数据集(在using语句之外),但我有“Include”
我尝试过的
我已经尝试了“include”,我还确保没有其他关联是
MyObject
类的一部分(即,我没有其他include()
s可写)。当您使用include和延迟加载,并将dbContext包装在using语句中时,一旦它尝试获取链接对象,dbContext就已经被释放。
您可以尝试如下方式加载导航属性:
IQueryable<MyObjects> query = db.MyObjects.Include(m => m.Contact);
IQueryable query=db.MyObjects.Include(m=>m.Contact);
或者你可以去掉Using语句,因为它限制了你的延迟加载…为了避免这种情况,你有一些选择。不要将你的导航属性声明为虚拟的,也不要在你的上下文中禁用延迟加载行为。默认情况下启用延迟加载,通过创建派生代理类型的实例,然后覆盖
virtual
属性以添加加载挂钩来实现。因此,如果您想使用序列化程序,我建议您关闭延迟加载:
public class YourContext : DbContext
{
public YourContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
这些链接可以帮助您更好地理解我在回答中的解释:
virtual
关键字,则POCO实体不符合第二个链接中描述的要求,因此,EF不会创建代理类来延迟加载导航属性。但是,如果禁用了延迟加载,即使导航属性是虚拟的,它们也不会加载到任何实体中。在使用序列化程序时,最好禁用延迟加载。大多数序列化程序通过访问类型实例上的每个属性来工作
作为第三个选项,您可以在导航属性上使用您不希望被序列化为实体一部分的属性,但正如我前面所说的,最好的选项是禁用延迟加载。我遇到了相同的问题,解决方法如下 我创建了一个新对象,并将从db获取对象后要使用的值放入其中 示例代码:
var listFromDb= db.XTable.Where(x => x.Id > 5).ToList();
var list = new List<Package>();
foreach (var item in listFromDb)
{
var a = new Package()
{
AccountNo = item.AccountNo,
CreateDate = item.CreateDate,
IsResultCreated = item.IsResultCreated,
};
list.Add(a);
}
var listFromDb=db.XTable.Where(x=>x.Id>5.ToList();
var list=新列表();
foreach(listFromDb中的变量项)
{
var a=新包()
{
AccountNo=项目。AccountNo,
CreateDate=item.CreateDate,
IsResultCreated=item.IsResultCreated,
};
列表.添加(a);
}
如果我删除using语句,我肯定会将不必要的工作留给垃圾收集器?我从不喜欢不处理实现IDisposable的东西。我可能错了?@JayMee那么如果你想保留“Using”语句,你需要使用渴望加载(如我这里的代码所示)……太棒了!我现在不在家,无法尝试你的解决方案,但我充满希望。我会尝试并测试它,然后给出反馈。再次感谢+1.恰到好处。谢谢你,伙计。很高兴能帮助你;)除此之外,我还必须克隆实体,因为我使用了两个上下文,一个用于联机,另一个用于脱机数据库
var listFromDb= db.XTable.Where(x => x.Id > 5).ToList();
var list = new List<Package>();
foreach (var item in listFromDb)
{
var a = new Package()
{
AccountNo = item.AccountNo,
CreateDate = item.CreateDate,
IsResultCreated = item.IsResultCreated,
};
list.Add(a);
}