0

我仍在 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
    }

延迟加载显然仅适用于 Navigation 属性,但不适用于 Tenant 属性。我将两个属性 (UsersName) 都设为虚拟,但这似乎无关紧要。

我怎样才能lazy load获得本地属性Tenant

4

1 回答 1

1

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

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

_applicationContext.Entry(tenant).Reload();

...after Attach or by replacing the first three lines by:

var tenant = _applicationContext.Tenants
    .Find(new Guid("d176dc7c-6b96-4ab6-bddf-ce5a12024c39"));
于 2013-01-27T20:42:52.350 回答