实体框架代码首次延迟加载

Cat*_*lin 30 c# entity-framework lazy-loading entity-framework-4 ef-code-first

我有两个对象类

public class User
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    // Navigation
    public ICollection<Product> Products { get; set; }
}

public class Product
{
    public Guid Id { get; set; }

    // Navigation
    public User User { get; set; }
    public Guid User_Id { get; set; }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我使用dataContext加载用户时,我得到的产品列表为null(这没关系).

如果我在产品列表中添加"虚拟"关键字,

public virtual ICollection<Product> Products { get; set; }
Run Code Online (Sandbox Code Playgroud)

当我加载用户时,我也获得了产品列表.

为什么会这样?我认为"虚拟"关键字用于不加载实体,除非你明确这个(使用"包含"语句)

我想我错了

arc*_*hil 66

这是错的

"virtual"关键字用于不加载实体,除非您明确指出(使用"Include"语句)

延迟加载意味着当您第一次访问集合或导航属性时将自动加载实体,这将透明地发生,就像它们总是加载父对象一样.

当您指定要查询的属性时,使用"include"按需加载.

virtual关键字的存在仅与延迟加载有关.virtual关键字允许实体框架运行时为您的实体类及其属性创建动态代理,并通过该支持延迟加载.如果没有虚拟,则不支持延迟加载,并且您在集合属性上获得null.

事实是,你可以在任何情况下使用"include",但没有延迟加载它是访问集合和导航属性的唯一方法.

  • @RaraituL是的,这是对的.调试时,实际上**访问**属性,如果支持延迟加载,它们会被加载.因此,您可以使用sql profiler或类似工具来调试发送到数据库的实际查询. (5认同)