实体框架渴望加载不返回数据,延迟加载

时间:2013-09-20 12:59:03

标签: c# entity-framework lazy-loading poco

我首先使用代码 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; } 
    }
}

3 个答案:

答案 0 :(得分:39)

这是一种常见的混淆。延迟加载的反面是:没有加载,除非您自己明确加载(例如,通过使用Include急切加载)。

因此,如果您以任何方式关闭延迟加载 - 删除virtual修饰符就是其中之一 - 行为不会变成急切加载没有加载

想想看,假设EF会急切地加载未标记为延迟加载的所有内容。您可以通过执行一个简单的查询来加载一半数据库的风险!

默认情况下,no way可以使导航属性急切加载(如果您在阅读完上述内容后仍然需要这样做)。

答案 1 :(得分:2)

您需要使用include方法强制加载实体中的ICollections。以下链接可能会对您有所帮助:http://msdn.microsoft.com/en-us/data/jj574232.aspx

答案 2 :(得分:-3)

这里只提一件事。

如果我用

关闭EF的LazyLoading
this.DbContext.Configuration.LazyLoadingEnabled = false;

然后,“include”方法不会加载子实体进行Eagerly加载。

所以,如果我想在查询中使用“include”,我需要同时打开EF的LazyLoading属性。