EF 代码第一个子集合未填充

EF code first child collection not populating

很长一段时间以来,我一直在努力解决这个问题,世界上所有的谷歌搜索都无济于事。我知道一定要简单。

型号:

public class List {

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public virtual IList<ListItem> ListItems { get; set; }

}

public class ListItem {

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public bool IsComplete { get; set; }

}

当我设置:

Configuration.ProxyCreationEnabled = false;

则以下为空:

context.Lists.First().ListItems.ToList();

当我设置:

Configuration.ProxyCreationEnabled = true;

我得到以下异常:

Error getting value from 'ListItems' on 'System.Data.Entity.DynamicProxies.List_5C17C9086854159E373744C770F3DDB07BBE4E3E23C2BD0E6B0C5DE3E13E63AD'

我不确定如何进行。如何通过列表访问列表项?

context.Lists.First().ListItems.ToList();

让我们分析一下: 你想得到数据库中的第一个List,其中returns一个List对象。 对于可引用的对象,EF 必须具体化该值,因此它执行 context.Lists.First() 的查询; 您可能会在这里看到问题:因为 属性 ListItems 是一个导航 属性,它不会从数据库中获取,因此它是空的(如果它由于急切加载而没有加载,显式加载)。

您必须使用 Include() 函数告诉 EF 您还希望填充导航 属性,例如:

context.Lists.Include(x=>x.ListItems).First().ListItems.ToList();

请注意,如果列表数据库中没有条目,则 first() 调用将失败 table,因此请考虑以下方法:

var List=context.Lists.Include(x=>x.ListItems).FirstOrDefault();
var ListItems=List==null?null:List.ListItems.ToList();

我将以下属性添加到模型中,这很痛苦:

[DataContract(IsReference = true)]

连同使用 context.List.Include(x => x.ListItems),我已经准备就绪。谢谢!