C# 实体框架-一对多-从两个表中选择

C# 实体框架-一对多-从两个表中选择,c#,entity-framework,C#,Entity Framework,在我的数据库中,我有“位置”和“图像”表。“图像”有一个来自位置的外键,这意味着每个位置可以有多个图像 我选择这样的地方: var query = (from x in DB.Places where x.CityId == CityId select x).ToList(); 当我想通过以下方式访问其图像:query.images.toList()我得到这个错误: ObjectContext实例已被释放,无法再使用 用于需要连接的操作 我的选择查询应该如何才能通过one选择查询获

在我的数据库中,我有“位置”和“图像”表。“图像”有一个来自位置的外键,这意味着每个位置可以有多个图像

我选择这样的地方:

var query = (from x in DB.Places
  where x.CityId == CityId 
  select x).ToList();
当我想通过以下方式访问其图像:
query.images.toList()我得到这个错误:

ObjectContext实例已被释放,无法再使用 用于需要连接的操作


我的选择查询应该如何才能通过one选择查询获得一个位置及其图像

提前感谢

MA.

您可以使用即时加载:

var query = (from x in DB.Places
             where x.CityId == CityId 
             select x).Include(p => p.Images).ToList();
在这种情况下,方法语法看起来更好

var query = DB.Places.Where(p => p.CityId == CityId).Include(p => p.Images).ToList();
另一个选项-在获得图像之前不要处理DbContext。例如,如果您正在使用
using
语句,只需在
using
块中删除它或获取图像即可。但它将使用第二个数据库查询来加载图像

进一步阅读:和

有两种选择:

1) 启用快速加载(不是好主意)

2) 保持延迟加载并包含您想要获取的实体

备选案文2:

var query = DB.Places.Include(z => z.Images).Where(x => x.CityId == CityId).ToList();
您得到的异常是因为在
上下文
对象上启用了
懒散加载
。我猜您正在尝试访问EF之外的属性,但它已被处置

在延迟加载中,第一次调用属性实际上是连接数据库并检索所需的数据

有关更多信息,请点击该链接:

第一点

您通过Include查询只接受字符串,这意味着您对EF有一个抽象,我认为在您的示例中,您使用的是DynamicLibrary

第二点

实体不会通过访问自动加载,这意味着您只使用了急加载,而不是延迟加载!-->我不知道你有什么

在您的情况下,在执行任何查询之前,您必须始终包含集合,否则您将始终得到一个空集合

修复

// Include First
DbContext.Places.Include("Images"); // ---> you can go here recursively deeper for example "Images.Data"

// Then execute the query!
第三点

您已发布DbContext disposed异常,这意味着您正在使用范围之外访问DbContext

修复


只要您正在使用DbContext,就不要处置它

如果启用了延迟加载,则会自动获取所选位置的图像。 所以在你的情况下

var query = (from x in DB.Places
where x.CityId == CityId 
select x).ToList();
因为你们正在获取对象列表。您必须先选择特定项目,然后才能访问其内部详细信息

 : query.FirstOrDefault().Images.ToList(); // only to get the images of the first record in the list. If that list has values.
如果启用了即时加载,则在执行第一个tolist之前,必须使用.Include()函数加载所需的表。
我建议你选择选项1

谢谢,伙计,但是在我的例子中的“Include()”只接受字符串而不是lambdaexpression@MohamadArmoon您应该使用System.Data.Entity为基于lambda的Include扩展添加
命名空间(我建议使用它而不是字符串-如果您重命名导航属性,它将自动更新,并且可以安全地避免输入错误)