【问题标题】:How can i fix the dispose object error in static methods? [duplicate]如何修复静态方法中的 dispose 对象错误? [复制]
【发布时间】:2025-12-24 22:25:21
【问题描述】:

如何从静态函数中获取包含数据库中所有数据和参考数据的列表?我尝试使用db.Configuration.LazyLoadingEnabled = true;,但该函数只返回项目信息,参考数据为空。

public static Project GetProject(Guid ProjectID)
        {
            if (!ProjectID.Equals(null))
            {
                using (var db = new dbEntity())
                {
                    return db.Projects.Single(Project => Project.Id.Equals(ProjectID));

                }

            }
            return null;
        }

错误:

ObjectContext 实例已被释放,不能再使用 用于需要连接的操作。

我在哪里调用函数:

@{var project = StaticMethods.GetProject(Guid.Parse(ViewContext.RouteData.Values["id"].ToString()));}
@for(var item in project.Users().ToList()){
 ....
}

【问题讨论】:

  • Project的结构是什么
  • @MichaelRandall 它是一个自动生成的模型,来自 db ``` public System.Guid Id { get;放; } 公共字符串名称 { 获取;放; } 公共字符串号码 { 获取;放; } 公共虚拟 ICollection 用户 { 获取;放; } ```
  • 另外,如果ProjectIDnullif (ProjectID.Equals(null)) 将抛出 NullReferenceException。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您可以使用 Linq 预加载并明确表达您想要包含到结果对象图中的内容。使用.Include()-method 实现了急切加载。

您没有提供实体的模型类,但我假设关系是一对一的(项目具有引用作为属性)。以下 sn-p 加载 Project 及其 Reference-property:

public static Project GetProject(Guid ProjectID)
{
    if (!ProjectID.Equals(null))
    {
        using (var db = new dbEntity())
        {
            return db.Projects.Include(r => r.Reference).Single(Project => Project.Id.Equals(ProjectID));
        }
    }
    return null;
}

【讨论】:

    【解决方案2】:

    简而言之,延迟加载问题。

    原因如下:

    1. 你打开 DbContext
    2. 执行您的查询
    3. 返回你的Project
    4. 访问 virtual 属性,该属性试图在 DbContext 被释放后延迟加载相关资源。

    您必须执行以下操作之一:

    【讨论】: