繁体   English   中英

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

[英]Entity framework - one to many - select from both table

在我的数据库中,我有“Place”和“Image”表。 “图像”具有来自Place的外键,这意味着每个地方可以具有多个图像。

我选择这样的地方:

var query = (from x in DB.Places
  where x.CityId == CityId 
  select x).ToList();

当我想通过以下方式访问其图像时: query.Images.toList(); 我收到此错误:

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


怎么应该是我的选择查询,以获得一个地方,它的图像只是一个选择查询?

提前致谢
嘛。

您可以使用预先加载:

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();

您获得的异常是因为在context对象上启用了LazyLoading 您正试图访问EF以外的物业,我猜它已经处理好了。

在Lazy Loading中第一次调用属性实际上是连接数据库并检索所需的数据。

有关更多信息,请访问以下链接: https//msdn.microsoft.com/en-us/library/jj574232(v = vs133).aspx

第一点!

您通过Include查询仅接受字符串,这意味着您在EF上有一个抽象,我认为在您的情况下您使用的是DynamicLibrary。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

第二点!

实体不会通过访问它们自动加载,这意味着您只使用Eager加载而不是延迟加载! - >我不确定你有什么!

在您的情况下,您始终要在执行任何查询之前包含集合,否则您将始终获得空集合!

固定

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

// Then execute the query!

第三点!

您已发布DbContext置备异常,这意味着您正在访问使用范围之外的 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.

如果您启用了预先加载,则必须使用.Include()函数在执行第一次tolist之前加载所需的表。 我建议你选择1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM