C# 对象实例已被释放(EF)

C# 对象实例已被释放(EF),c#,entity-framework,entity,dispose,objectdisposedexception,C#,Entity Framework,Entity,Dispose,Objectdisposedexception,在EntityFramework中检索项目实体时遇到一些问题。它一直给我Objest实例已被错误处理 我有两个实例,如下图所示 下面的代码给出了错误: public Project GetProjectyById(int id) { using (var context = new CoderaDBEntities()) { return context.Projects.First(c => c.Id == id);

在EntityFramework中检索项目实体时遇到一些问题。它一直给我Objest实例已被错误处理

我有两个实例,如下图所示

下面的代码给出了错误:

    public Project GetProjectyById(int id)
    {
        using (var context = new CoderaDBEntities())
        {
            return context.Projects.First(c => c.Id == id);
        }
    }
从Project中检索到的所有内容都很好,但是Project对象中的Category对象(关联)向我传递了对象已被处置的错误。发生什么事了

谢谢


编辑:您是否觉得该关联很奇怪?

当DBContext对象已被释放时,您似乎正在尝试使用延迟加载来访问与类别相关的对象(将其包装在using语句中会在其超出范围时释放)。 延迟加载是指EF仅在代码中请求相关实体时才加载它们

要避免这种情况,应使用Include语句显式加载相关对象:

return context.Projects.Include("Category").First(c => c.Id == id);
或者,您可以如下所示以强类型方式加载此文件,但请确保添加“using System.Data.Entity;”参考文献

return context.Projects.Include(x => x.Category).First(c => c.Id == id);
另一种选择是允许延迟加载,方法是不在using语句中包装DbContext对象,如下所示

  public Project GetProjectyById(int id)
    {
        var context = new CoderaDBEntities() 
        return context.Projects.First(c => c.Id == id);       
    }

哦,上帝。。我忘了:哦,我警告过自己要记住这一点,但我还是忘了:(谢谢柔道!顺便问一下..这个关联看起来对你合适吗?因为我也可以用多个项目实例创建一个类别实例(永远不会发生,但仍然如此)我不太确定数据的结构,但是如果一个项目应该只有一个类别,并且几个项目可以在同一个类别下,这是正确的。如果一个项目可以有多个类别,那么多对多的关系将是最好的。不,我希望每个项目有一个类别,所以它确实很好。我会ike说我可以关闭EDMX文件中的延迟加载,但是Category对象为NULL,“这个关联对你来说奇怪吗?”-您的关系状态1个类别可以与许多项目关联,或者换一种说法,每个项目只能有1个类别。对我来说似乎合理-规则应该是什么?