26

我有两个对象类实体框架代码优先延迟加载

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; } 
} 

当我加载使用DataContext的用户,我得到的产品是空的列表(这是确定)。

如果我添加了“虚拟”关键字产品列表,

public virtual ICollection<Product> Products { get; set; } 

当我加载用户,我得到的产品名单。

这是怎么发生的?我认为,“虚拟”关键字用于不加载,除非你的实体明确这(使用“包括”语句)

我想我完全搞错了

+1

你可以使用context.ContextOptions.LazyLoadingEnabled = false;强制上下文不要使用LazyLoading – 2012-07-13 11:22:09

+0

使用dbContext它会是context.Configuration.LazyLoadingEnabled = false;不使用“虚拟”的 – VivekDev 2015-12-25 17:08:56

回答

55

这是错误的

“虚拟”关键字用于不加载实体,除非你 明确这(使用“包括”语句)

延迟加载意味着实体将被自动加载时您首先访问集合或导航属性,并且这将会透明地进行,就好像它们总是装载父对象一样。

当您指定要查询的属性时,使用“include”按需加载。

存在virtual关键字只与延迟加载有关。 virtual关键字允许实体框架运行时为您的实体类及其属性创建动态代理,并支持延迟加载。如果没有虚拟,延迟加载将不被支持,并且您在集合属性上获得空值。

事实是,您可以在任何情况下使用“包含”,但无需延迟加载,它是访问收集和导航属性的唯一方法。

+0

_“延迟加载意味着实体将在第一次访问集合时自动加载”_这意味着如果我永远不会访问user.Products属性,则产品将不会加载,对吗? – Catalin 2012-07-13 11:35:53

+0

@RaraituL:对 – abatishchev 2012-07-13 11:44:11

+5

@RaraituL是的,那是对的。在调试时,您实际上**访问**属性,并且如果支持延迟加载,则会加载它们。所以你可以使用sql profiler或类似的工具来调试发送到数据库的实际查询。 – archil 2012-07-13 11:47:41

4

我猜你quiring为属性这对于延迟加载对象而被的EF上下文:

using (var db = new Context()) 
{ 
    var user = db.Users.Where(...); 

    var products = user.Products; // being loaded right away 
} 

试图离开它:

User user; 
using (var db = new Context()) 
{ 
    user = db.Users.Where(...); 

    // I guess you will need here: 
    // .Include(u => u.Products) 
} 
var products = user.Products; // what error will you get here? 
+0

:User user = db.Users.First();在调试模式下,user.Products为空。使用“虚拟”关键字:User user = db.Users.First();在调试模式下,user.Products是一个产品列表 – Catalin 2012-07-13 11:33:19

+0

@RaraituL:正如archil已经提到的,你必须在Code First方法中使用virtual关键字来使延迟加载成为可能。然后,您可以打开或关闭它。 – abatishchev 2012-07-13 11:45:21

+0

但上下文在“user.Products”之前是“关闭的”,所以如果存在上下文,延迟加载将如何工作? – Nerf 2017-04-21 13:49:44