C# ObjectContext实例已被释放,无法再使用

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 =

这个问题我已经被问过无数次了,但我遇到的每一个建议我似乎都已经涵盖了

我的MVC解决方案中有实体框架,我有一个“存储库”,试图检索
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);
      }