LazyLoadingEnabled false 但仍未加载

LazyLoadingEnabled false but still not loading

我的 EF 代码优先数据模型中有以下内容:

public class B
{
   [Key]
   public int Id { get; set; } 
   ... some data ..
}

public class D: B
{
    public D() { RelatedData = new List<RelatedData>(); }
    public List<RelatedData> RelatedData { get; set; }
}

public class RelatedData
{
    [Key]
    public int Id { get; set; }
    public int DId { get; set; }
    ... some data ...
}

在数据库中,我要查找一条记录D,它有2条RelatedData记录。

我的访问例程通过基class获取数据。

B Lookup(int desiredId)
{
    ...
    using (MyDataContext db = new MyDataContext())
    {
        db.Configuration.LazyLoadingEnabled = false;

        B b = (from x in db.B
               where x.Id == desiredId
               select x).FirstOrDefault();

        // b is actually a type D; however, ReleatedData has no records.
        // If I serialize b and return it, ReleatedData is empty.

        // Running this silly code below when I am dealing with a type D
        // which really only hits the DB and throws away the data now forces
        // the related data in b to load.
        if ( b is  D)
        {
            var notUsed = (from r in db.RelatedData
                           where r.DId == desiredId
                           select r).ToList();

            // Serializing b now gives valid results.
        }
    }
}

}

为什么我必须执行检索相关数据的额外步骤? LazyLoadingEnabled = false 是否应在第一次查询期间强制加载所有相关数据?

在此先感谢您的帮助。

一个解决方案可以是首先使用 OfType 扩展方法仅与 D 实体一起使用,然后使用 Include 扩展方法来预先加载 RelatedData 导航 属性.

var d= db.B.OfType<D>().Include(d=>d.RelatedData).FirstOrDefault(d=>d.Id == desiredId);

关于您的问题,您不需要执行额外的查询来加载相关实体。如果您再次启用延迟加载并将 RelatedData 属性 声明为 virtual,您将在第一次查询后查询 属性 时看到 EF 将加载该相关实体。如果您想查看在 POCO 实体中需要遵循的要求,请选中此 link.

更新

好吧,正如我在评论中所说,也许您遗漏了一些无法让延迟加载正常工作的东西。

另一种解决方案可能是 load explicitly 导航 属性:

 D entity= b as D;
context.Entry(entity).Collection(p => p.RelatedData).Load();