我首先使用代码 EF5 ,我有一个对象,其集合定义为virtual
(延迟加载)。这会在调用时返回数据。但是我希望它能够满载。我已从属性签名中删除了virtual
,但现在它始终返回null
个数据。 EF甚至不运行查询,有人可以帮忙吗?
编辑:我知道.include()
我更喜欢使用非虚拟属性方法。
物件
User
([Key]
我在资源对象上,这是人类的父级):
namespace Entities
{
[Table("Users")]
public class User : Person
{
[Required]
public ICollection<Role> Roles { get; set; }
}
}
作用:
namespace Entities
{
public class Role
{
[Key]
public string Id { get; set; }
public virtual ICollection<User> Users { get; set; }
}
}
答案 0 :(得分:39)
这是一种常见的混淆。延迟加载的反面是:没有加载,除非您自己明确加载(例如,通过使用Include
急切加载)。
因此,如果您以任何方式关闭延迟加载 - 删除virtual
修饰符就是其中之一 - 行为不会变成急切加载但没有加载强>
想想看,假设EF会急切地加载未标记为延迟加载的所有内容。您可以通过执行一个简单的查询来加载一半数据库的风险!
默认情况下,no way可以使导航属性急切加载(如果您在阅读完上述内容后仍然需要这样做)。
答案 1 :(得分:2)
您需要使用include方法强制加载实体中的ICollections。以下链接可能会对您有所帮助:http://msdn.microsoft.com/en-us/data/jj574232.aspx
答案 2 :(得分:-3)
这里只提一件事。
如果我用
关闭EF的LazyLoadingthis.DbContext.Configuration.LazyLoadingEnabled = false;
然后,“include”方法不会加载子实体进行Eagerly加载。
所以,如果我想在查询中使用“include”,我需要同时打开EF的LazyLoading属性。