实体框架包括需要.first()吗?

本文关键字:first 框架 包括需 实体 | 更新日期: 2023-09-27 17:50:37

当在上下文创建时设置即时加载时,在EF中使用Include的许多示例是这样的(给定两个相关的实体,称为Resources和variables):

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

但其他人没有:

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

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

实体框架包括需要.first()吗?

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的效果。您需要在每个查询中包含它。

当你这么做的时候

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

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

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

换句话说,实体框架支持三种方式来加载相关实体:

  • 动态加载
  • 延迟加载
  • 显式加载

本文将详细讨论上述三种技术加载相关实体

下面的代码片段使用了急切加载:

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

Edit:如果由于某种原因您混淆了延迟加载,那么您可以使用选项在上下文中关闭它。

public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }