-1

在创建上下文时设置预加载时,Include在 EF 中使用的许多示例如下所示(给定两个相关实体,称为 Resources 和 Variations):

var context = new MyContext();
context.Resources.Include(x => x.Variations).First();
return context;

但其他人不会:

context.Resources.Include(x => x.Variations);

只有前者似乎对我有用,但我找不到任何解释为什么需要它?

4

3 回答 3

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在构造查询时始终隐式执行的效果。您需要将其包含在每个查询中。

于 2013-01-03T15:30:51.637 回答
0

当你这样做

context.Resources.Include(x => x.Variations);

你得到一个资源对象的列表。using.First()将为您提供该资源列表中的第一个资源。

于 2013-01-03T12:47:32.597 回答
0

简而言之:称为不同实体加载的效果。在 Entity Framework 中,有三种加载方式:惰性加载、显式加载和急切加载方法,您可以从中选择,并在代码中相应地使用它们。

换句话说,Entity Framework 支持三种加载相关实体的方式:

  • 急切加载
  • 延迟加载
  • 显式加载

本文详细讨论了上面显示的这三种技术 -加载相关实体

您下面的代码片段正在使用热切加载:

context.Resources.Include(x => x.Variations).First();

只有前者似乎对我有用,但我找不到任何解释为什么需要它?

后面的代码片段(没有 的那个.First())对你不起作用,因为相关实体的加载可以使用急切加载(参见上面的急切加载相关实体)或Load 方法来实现:

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

编辑:如果由于某种原因您对延迟加载感到困惑,那么您可以使用该选项在 context 中将其关闭

public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
于 2013-01-03T12:48:01.277 回答