【问题标题】: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; } 
    }
}

【问题讨论】:

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


    【解决方案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() 但更愿意在默认情况下使用非虚拟属性方法预先加载它。
    • 据我所知,默认情况下它不可用..您需要在某处或其他地方包含这些。有关方法,请查看此帖子 stackoverflow.com/questions/14512285/…
    • 参见:msdn.microsoft.com/en-us/data/jj574232.aspx“关闭特定导航属性的延迟加载”
    • 抱歉,多亏了 Gurts 的评论,我现在明白了(是它在 msdn 上的写法让我感到震惊)。扩展方法是一种非常好的方法,为此欢呼。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2021-10-21
    • 2014-02-18
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多