EF代码第一个子集合没有填充

时间:2015-08-11 04:16:32

标签: entity-framework ef-code-first linq-to-entities code-first

我长期以来一直在反对这一点,世界上所有的Google搜索都没有帮助。我知道它必须简单。

型号:

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;

然后以下是null:

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

当我设置:

Configuration.ProxyCreationEnabled = true;

我得到以下异常:

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

我不知道该怎么办。如何通过List访问ListItem?

2 个答案:

答案 0 :(得分:1)

<form id="form1" action="http://localhost/urlone" method="get">
    <input type="text" name="field1" />
    <input type="submit" />
</form>

<form id="form2" action="http://localhost/urltwo" method="post">
    <input type="text" name="field2" />
    <input type="submit" />
</form>

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

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

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

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

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

答案 1 :(得分:0)

我在模型中添加了以下属性:

[DataContract(IsReference = true)]

那,以及使用context.List.Include(x =&gt; x.ListItems),我都设置好了。谢谢!