实体框架急切加载不返回数据,延迟加载有
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 上的写法让我感到震惊)。扩展方法是一种非常好的方法,为此欢呼。以上是关于实体框架急切加载不返回数据,延迟加载有的主要内容,如果未能解决你的问题,请参考以下文章