延迟加载实体,正在加载引用但实体属性不是

Posted

技术标签:

【中文标题】延迟加载实体,正在加载引用但实体属性不是【英文标题】:Lazyloading entities, references are loading but entity properties aren't 【发布时间】:2013-01-27 17:43:48 【问题描述】:

我仍处于 EF 学习过程中,我正在尝试更熟悉 EF 延迟加载。

请考虑以下课程和测试:

[Table("Tenant")]
public class  Tenant : IEntity

    public int Id  get; set; 
    public virtual string Name  get; set; 
    [Key]
    public string Guid  get; set; 
    public virtual ICollection<User> Users  get; set; 
    public virtual ICollection<CaseType> CaseTypes  get; set; 

    public Tenant()
    
        Users = new List<User>();
        CaseTypes = new List<CaseType>();
    

还有测试:

    [Test]
    public void TenantLazyLoading()
    
        var tenant = _applicationContext.Tenants.Create();
        tenant.Guid = "d176dc7c-6b96-4ab6-bddf-ce5a12024c39";
        _applicationContext.Tenants.Attach(tenant);
        Assert.AreEqual(1, tenant.Users.Count); // Pass, the navigation property users was loaded (lazy)
        Assert.AreEqual("localhost", tenant.Name); // Fail, the tenant name is not loaded
    

延迟加载显然只适用于导航属性,但不适用于租户属性。我将两个属性(UsersName)都设为虚拟,但这似乎并不重要。

如何lazy loadTenant 的本地属性?

【问题讨论】:

【参考方案1】:

这就是它的工作方式。如果您手动创建实体并将其 Attach 到上下文中,则您告诉 EF 您不想加载实体的标量属性。

没有延迟加载标量属性,您必须始终明确地执行此操作,或者通过添加...

_applicationContext.Entry(tenant).Reload();

...在Attach 之后或将前三行替换为:

var tenant = _applicationContext.Tenants
    .Find(new Guid("d176dc7c-6b96-4ab6-bddf-ce5a12024c39"));

【讨论】:

以上是关于延迟加载实体,正在加载引用但实体属性不是的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 延迟加载

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

JavaWeb系列——Hibernate——延迟加载(转)

Hibernate延迟加载机制

Hibernate延迟加载

延迟加载 - (实体框架)底层连接意外关闭