18

我首先使用代码EF5,并且我有一个对象,该对象的集合定义为virtual(延迟加载)。这会在调用时返回数据。但是我希望它能够被急切地加载。我已从virtual属性签名中删除,但现在它总是返回null数据。EF 甚至不运行查询,有人可以帮忙吗?

编辑:我知道.include()我只是更喜欢使用非虚拟属性方法来做这件事。

对象

User[Key]Id 在 Resource 对象上,它是 person 类的父类):

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

3 回答 3

40

这是一个常见的混淆。延迟加载的反面是:除非您自己明确地进行加载(例如通过使用 急切加载),否则Include不加载。

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

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

默认情况下,无法使导航属性预先加载(如果您在阅读上述内容后仍然想要它)。

于 2013-09-20T15:07:50.087 回答
2

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

于 2013-09-20T13:08:33.937 回答
-2

这里只提一件事。

如果我关闭 EF 的 LazyLoading

this.DbContext.Configuration.LazyLoadingEnabled = false;

然后,“include”方法将不会加载子实体以进行急切加载。

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

于 2014-03-06T20:19:55.273 回答