实体框架包括需要.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);
只有前者似乎对我有用,但我找不到任何解释,为什么需要它?
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;
}