C#/ EntityFramework - 访问和实体正在引发System.ObjectDisposedException

时间:2014-06-08 18:40:44

标签: c# entity-framework

我相当新EntityFramework所以我希望我能以正确的方式解决这个问题。

我有一个DbContext课程:

public class UsersDbContext : DbContext
{
    public DbSet<DbUsersModel> Users { get; set; }
    public DbSet<DbApplicationsModel> Applications { get; set; }
    public DbSet<DbImageModel> Images { get; set; }
}

这适用于具有以下结构的code-first数据库:每个DbUsersModel都有多个DbApplicationsModel元素,每个DbApplicationsModel都有多个DbImageModel元素。< / p>

鉴于DbImageModel.ImageTag,我希望获得它所属的DbApplicationsModel

我可以使用以下代码轻松获取基于DbImageModel属性的DbImageModel.ImageTag信息:

using (UsersDbContext ctx = new UsersDbContext())
{
    DbImageModel image = ctx.Images.FirstOrDefault(s => s.ImageTag == imageTag);
    if (image != null)
    {
        return image;
    }
}

这会正确地返回DbImageModel的实例,但是,在父类中(返回image的地方),我无法访问image.Applications因为System.ObjectDisposedException异常是被解雇,大概是因为我试图在image.Applications之外访问using

有没有办法迫使contextimage.Applications内获取using并保留它,以便可以在using代码之外访问这些信息?

1 个答案:

答案 0 :(得分:1)

是的,而不是延迟加载应用程序,急切加载(由including相关实体加载到结果集中):

using (UsersDbContext ctx = new UsersDbContext())
{
    DbImageModel image = ctx.Images.Include(i => i.Applications)
                            .FirstOrDefault(s => s.ImageTag == imageTag);
    if (image != null)        
        return image;        
}

使用延迟加载EF返回引用DbContext的代理类。当您尝试稍后获取相关实体时,将使用此引用。如果此时处理了上下文,则会看到 ObjectDisposedException

当加载主实体时,Eager加载同时加载相关实体。

建议阅读:Loading Related Entities with Entity Framework