2017-04-14 60 views
3

假设我们有一个像下面的第三Dbsets:的EntityFramework包括(贪婪加载)虚拟财产的虚拟财产

Category 
{ 
... 
    public virtual ICollection<Item> Items {get; set;} 
... 
} 

Item 
{ 
... 
    public virtual ICollection<Specification> Specifications{get; set;} 
... 
} 

Specification 
{ 
... 
} 

对于预先加载我用这样的:

Category cat = db.Categories.Include(c=> c.Items).FirstOrDefault(c=> c.Id == 1); 

但现在的问题是

cat.Items[0].Specificationsnull,我们怎样才能使它成为热门的集合子集合呢?

P.S .:我试图删除virtual关键字进行测试(我不想删除它),但它也没有工作。

+0

如果*转到VS定义为*'Include'方法,你会发现一个完整的帮助主题,描述不同的'Include'场景。基本上你需要使用“选择”向下导航。 –

+0

您可以使用其他包含。以字符串作为参数的那个。然后你可以这样做:'Include(“Items.Specifications”)' – Alex

回答

5

您也可以使用符号

db.Categories.Include("Items.Specifications") 

说明它已经是一个字符串

+1

如果您重命名“Items”或“Specifications”属性,Visual Studio将不会重构此字符串。 –

+0

@MariusOrha这是另一个问题。事实是马克的解决方案将工作 – Alex

+0

这只是一个额外的信息。 –

6
Category cat = db.Categories 
     .Include(c => c.Items.Select(s => s.Specifications)) 
     .FirstOrDefault(c => c.Id == 1); 
+0

只是想明确说明虚拟与问题无关。 –

+0

是的,选择部分是有义务的。 –