![](/img/trans.png)
[英]Entity Framework select distinct values from one to many table with filter
[英]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。
第二点!
实体不会通过访问它们自动加载,这意味着您只使用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.