如何在Entity Framework 5中正确触发延迟加载的集合?

Nel*_*rum 3 .net c# entity-framework entity-framework-5

我在我的应用程序中使用EF5(代码优先).我有一个包含一些延迟加载字段的表.

public class TestEntity
{
    public int Id { get; set; }

    public virtual TestEntity2 SubEntity2 { get; set; }
    public virtual TestEntity3 SubEntity3 { get; set; }

    private ICollection<SubEntity4> _subEntities;
    public ICollection<SubEntity4> SubEntities
    {
        get { return _subEntities ?? (_subEntities = new Collection<SubEntity4>()); }
        protected set { _subEntities = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从数据库SubEntity2和SubEntity3读取此内容时正好加载,但SubEntities集合不会加载,它始终保持Count = 0.所以我强迫这样加载:

db.Entry(queryResult).Collection(rr => rr.SubEntities).Load();
Run Code Online (Sandbox Code Playgroud)

但据我所知,这个集合应该在第一次调用时由EF自动加载,就像SubEntity2和SubEntity3一样.为什么不与收藏合作?

我用来读取数据库的代码示例:

using (var db = new TestContext(_connection, false))
        {
            var query = from r in db.SubEntities
                        where r.Id == 10
                        select r;

            var queryRes = query.FirstOrDefault();
            if (queryRes != null)
            {
                if (queryRes.FederalRegion != null)
                {
                    // Do something
                }

                foreach (var dbEnt in queryRes.SubEntities)
                {
                    // Do something
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jus*_*now 8

为了使延迟加载工作,EF5必须做一些棘手的工作.在运行时,它们创建代理类,这些代理类派生自您的模型类.在这些代理类中,它们覆盖导航属性以实现延迟加载机制.

SubEntity2SubEntity3属性是虚拟的,因此可以覆盖它们.您的SubEntities属性不是虚拟的 - EF5无法覆盖此属性以实现延迟加载.

当你使你的SubEntities财产虚拟时,它应该工作.