实体框架急切加载不返回数据,延迟加载有

Posted

技术标签:

【中文标题】实体框架急切加载不返回数据,延迟加载有【英文标题】:Entity Framework Eager Load Not Returning Data, Lazy Load Does 【发布时间】:2013-09-25 21:07:45 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这里只提一件事。

如果我关闭 EF 的 LazyLoading

this.DbContext.Configuration.LazyLoadingEnabled = false;

那么,"include" 方法将不会为 Eagerly 加载加载子实体。

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

【讨论】:

呃,这根本不是真的。你能举一个你遇到这种情况的例子吗?一定是发生了什么事情。 我知道这篇文章有点过时了,但我遇到了同样的问题(EF6,模型优先,通过 edmx 中的注释禁用了 LazyLoading)。【参考方案2】:

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

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

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

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

【讨论】:

关于从延迟加载中移除虚拟开关的提示节省了我的时间;)。谢谢!!!【参考方案3】:

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

【讨论】:

感谢您的回复,我知道 .include() 但更愿意在默认情况下使用非虚拟属性方法预先加载它。 据我所知,默认情况下它不可用..您需要在某处或其他地方包含这些。有关方法,请查看此帖子 ***.com/questions/14512285/… 参见:msdn.microsoft.com/en-us/data/jj574232.aspx“关闭特定导航属性的延迟加载” 抱歉,多亏了 Gurts 的评论,我现在明白了(是它在 msdn 上的写法让我感到震惊)。扩展方法是一种非常好的方法,为此欢呼。

以上是关于实体框架急切加载不返回数据,延迟加载有的主要内容,如果未能解决你的问题,请参考以下文章

EF急切加载和延迟加载的区别?

使用 DTO 在实体框架中延迟加载

C# - 实体框架代码优先,延迟加载不起作用

何时在休眠中使用延迟加载/急切加载?

如何使用实体框架将大量数据延迟加载到 GridView [关闭]

LINQ中的First()会导致急切或延迟加载吗?