猿教程 Logo

Entity Frameworklan延迟加载

Entity Framework的一个重要功能是延迟加载。 延迟加载意味着延迟加载相关数据,直到您特别请求它。 例如,Student类包含StudentAddress作为复杂属性。 因此,上下文首先加载数据库中的所有学生,然后当我们访问StudentAddress属性时,它将加载特定学生的地址,如下所示。

using (var ctx = new SchoolDBEntities())
    {
        //Loading students only
        IList<Student> studList = ctx.Students.ToList<Student>();
        Student std = studList[0];
        //Loads Student address for particular Student only (seperate SQL query)
        StudentAddress add = std.StudentAddress;
    }

上面显示的代码将导致两个SQL查询。 首先,它将提取所有学生:

SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[StudentName] AS [StudentName], 
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]

然后,当我们获得StudentAddress的引用时,它将发送以下查询:

exec sp_executesql N'SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[Address1] AS [Address1], 
[Extent1].[Address2] AS [Address2], 
[Extent1].[City] AS [City], 
[Extent1].[State] AS [State]
FROM [dbo].[StudentAddress] AS [Extent1]
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

但是,您也可以关闭特定属性或整个上下文的延迟加载。 要关闭特定属性的延迟加载,请不要将其属性设置为virtual。 要关闭上下文中所有实体的延迟加载,请将其配置属性设置为false:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;
    
public partial class SchoolDBEntities : DbContext
{
    public SchoolDBEntities(): base("name=SchoolDBEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
}

延迟加载的规则:

  1. context.Configuration.ProxyCreationEnabled应该为true。

  2. context.Configuration.LazyLoadingEnabled应为true。

  3. 导航属性应定义为public,virtual。 如果属性未定义为virtual,上下文将不会执行延迟加载。

猿教程(www.yuanjiaocheng.net)下一部分中将了解如何显式加载实体。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/lazy-loading-with-dbcontext.html