在上下文创建时设置预先加载时,在EF中使用Include
的许多示例都是这样的(给定两个称为资源和变体的相关实体):
var context = new MyContext();
context.Resources.Include(x => x.Variations).First();
return context;
但其他人不这样做:
context.Resources.Include(x => x.Variations);
只有前者似乎适合我,但我找不到任何解释为什么需要它?
答案 0 :(得分:2)
context.Resources.Include(x => x.Variations);
构造一个查询,在执行时加载所有资源及其变体。然后丢弃该查询。从不执行查询意味着您没有获得查询结果,并且您没有获得执行该查询的副作用。
您可以使用资源执行某些操作:
foreach (var resource in context.Resources.Include(x => x.Variations))
{
/* ... */
}
或者,如果您只想让对象出现在您的上下文中,
using System.Data.Entity;
context.Resources.Include(x => x.Variations).Load();
据我所知,没有办法设置上下文,以便在构造查询时始终隐式执行.Include
的效果。您需要在每个查询中包含它。
答案 1 :(得分:0)
当你这样做时
context.Resources.Include(x => x.Variations);
您将获得Resource对象的列表。使用.First()
将为您提供该资源列表中的第一个资源。
答案 2 :(得分:0)
简而言之:它被称为不同实体加载的效果。在实体框架中,有三个提货单:lazy,explicit和eagerly loading方法,您可以从中选择,并在代码中相应地使用。
换句话说,实体框架支持三种加载相关实体的方法:
本文详细讨论了上述三种技术 - Loading Related Entities。
下面的代码片段正在急切地加载:
context.Resources.Include(x => x.Variations).First();
只有前者似乎适合我,但我找不到任何解释为什么需要它?
后面的代码片段(没有.First()
的代码片段)不适合您,因为可以使用预先加载来加载相关实体(请参阅上面的热切加载相关实体)或加载方法:
context.Resources.Include(x => x.Variations).Load();
// or a sample like
// Load the posts related to a given blog
context.Entry(blog).Collection(p => p.Posts).Load();
编辑:如果由于某种原因您对延迟加载感到困惑,那么您可以使用在上下文中关闭的选项。
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}