【发布时间】:2012-02-07 01:34:56
【问题描述】:
抱歉,标题没有更具体 - 我不知道如何简洁地描述这一点。 我有具有多对多关系的 Trips 和 Location - 很简单,只是 Locations 不需要知道使用它们的 Trips。我创建了这些实体来表示这一点:
public class Trip
{
public int TripId { get; set; }
public virtual IList<TripLocation> TripLocations { get; set; }
}
public class TripLocation
{
public int TripId { get; set; }
public int LocationId { get; set; }
public virtual Location Location { get; set; }
}
public class Location
{
public int LocationId { get; set; }
// Note: Intentionally no collection of Trips
}
我可以让 Trip 急切加载它的 TripLocations,但我无法让 TripLocations 急切加载它们的位置。我在查询中尝试了一堆组合流畅的配置和“包含”,例如
IQueryable<Trip> query = from trip in context
.Include(r =>r.TripLocations)
.Include(r => r.TripLocations.Select(tl => tl.Location))
select ride;
非常感谢任何建议!
【问题讨论】:
-
对不起应该是“旅行”
-
为什么你的模型中有
TripLocation实体?此实体中是否还有其他您未显示的属性?否则,您可以从模型中完全删除此实体,并直接在Trip和Location之间创建多对多关系。在您当前的模型中,您实际上有两个一对多而不是多对多的关系。 -
TripLocation 在那里,因为我不想要位置中的旅行集合,而且我不知道如何使用流利的配置来进行多对多的操作。由于@tyron 的回答帮助我按原样工作,我要回去看看我是否能按照你的建议做。
-
只需使用
modelBuilder.Entity<Trip>().HasMany(t => t.Locations).WithMany().Map(...);。使用不带参数的WithMany()适用于Location中没有Trips集合的情况。 -
@tyron:我不确定我是否理解正确,但我的意思是:如果您在连接表中没有其他属性,您可以创建多对多没有中间实体的关系 (
TripLocation)。如果您具有这样的附加属性,则根本无法创建多对多关系,则必须创建两个一对多关系并将连接表作为模型中的实体公开: stackoverflow.com/a/7053393/270591
标签: entity-framework ef-code-first eager-loading