为什么Entity Framework会自动加载相关实体

时间:2016-08-05 09:33:51

标签: entity-framework

假设我有像

这样的表格
  1. 用户(ID,用户名,电子邮件,密码)
  2. User_Profile(ID,UserID_FK,First,Last,Middle)
  3. 我已经看到一些实现,如果我们尝试从Users表中获取数据,我们还需要相关的实体数据,那么我们使用

    db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList()

    但是在我的项目中,即使我使用

    db.Users.Where(z=>z.ID==1).ToList()

    我仍然可以获得相关实体。为什么会这样?

1 个答案:

答案 0 :(得分:2)

要回答您的问题,您必须了解EF中延迟加载和预先加载的基本思想。

急切地加载:

预先加载是一种过程,即对一种类型的实体的查询也会将相关实体作为查询的一部分加载。通过使用Include方法实现预先加载。例如, 您在下面的查询将加载具有Id 1的用户及其个人资料。

> var res = doc.autoTableHtmlToJson(document.getElementById(tableID)); 
> doc.autoTable(res.columns, res.data, {  styles: {overflow: 'linebreak'
> ,columnWidth: [100,80,80,70,80,80,70,70,70,70,60,80,100]},  startY:
> 60,  bodyStyles: {valign: 'top'},  });

延迟加载:

延迟加载是在第一次访问引用实体/实体的属性时从数据库自动加载实体或实体集合的过程。使用POCO实体类型时, 延迟加载是通过创建派生代理类型的实例然后重写虚拟属性以添加加载钩子来实现的。 例如,当使用代码中定义的User实体类时,将在第一次访问Proflie / s导航属性时加载相关的Profile .s。

关闭特定导航属性的延迟加载

  • 可以通过将Posts属性设置为非虚拟来关闭Posts集合的延迟加载。

关闭所有实体的延迟加载:

db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList()

明确加载:

显式加载定义为:当查询返回对象时,不会同时加载相关对象。默认情况下,在使用导航属性上的Load方法显式请求之前,不会加载它们。

资源:

https://msdn.microsoft.com/en-us/data/jj574232.aspx