我相当新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
。
有没有办法迫使context
在image.Applications
内获取using
并保留它,以便可以在using
代码之外访问这些信息?
答案 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加载同时加载相关实体。