我有两个对象类
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加载用户时,我得到的产品列表为null(这没关系)。
如果我在产品列表中添加“虚拟”关键字,
public virtual ICollection<Product> Products { get; set; }
当我加载用户时,我也会获得产品列表。
为什么会这样?我认为“虚拟”关键字用于不加载实体,除非你明确这个(使用“包含”语句)
我想我错了
答案 0 :(得分:66)
这是错误的
“virtual”关键字用于不加载实体,除非您 显式(使用“包含”语句)
延迟加载意味着当您第一次访问集合或导航属性时,将自动加载实体,这将透明地发生,就像它们总是加载父对象一样。
当您指定要查询的属性时,使用“include”按需加载。
virtual
关键字的存在仅与延迟加载有关。 virtual
关键字允许实体框架运行时为您的实体类及其属性创建动态代理,并通过该支持延迟加载。如果没有虚拟,则不支持延迟加载,并且您在集合属性上获得null。
事实是,你可以在任何情况下使用“include”,但是没有延迟加载,它是访问集合和导航属性的唯一方法。
答案 1 :(得分:4)
我猜你正在申请一个属性,这是一个懒惰的主题,而进入 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?