2014-01-17 154 views
1

我無法找到一種方法從數據庫及其所有相關對象中加載對象。關於此簡化模型(ID-屬性未示出):EF:加載相關對象的相關對象

class MainClass 
{ 
    public virtual ICollection<FirstLevelClass> FirstLevelObjects {get; set;} 
} 

class FirstLevelClass 
{ 
    public virtual ICollection<SecondLevelClassA> SecondLevelObjectsA {get; set;} 
    public virtual ICollection<SecondLevelClassB> SecondLevelObjectsB {get; set;} 
} 

class SecondLevelClassA 
{ 
    public virtual int SomeValue {get; set;} 

} 
class SecondLevelClassB 
{ 
    public virtual int SomeValue {get; set;} 

} 

的的DbContext是 「MainClass」 -Objects:

public SampleContext : DbContext 
{ 
    public DbSet<MainClass> MainClassObjects {get; set;} 
} 

我怎樣才能加載MainClass對象從分貝與所有第一方和二級對象?我可以這樣做:

using (var context = new SampleContext()) 
{ 
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects).ToList(); 

    // ...move objects from the context to program logic... 

} 

但是我如何獲得SecondLevelObjects? I'm失去了一些東西,如:

using (var context = new SampleContext()) 
{ 
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects.SecondLevelObjects).ToList(); 

    // ...move objects from the context to program logic... 

} 

這甚至可能還是我必須適應在的DbContext的DbSets?

回答

2

一種解決方案可以使用包括方法的其他重載這需要一個像這樣的字符串:

var MainClassObjects = context.MainClassObjects 
.Include("FirstLevelObjects") 
.Include("FirstLevelObjects.SecondLevelObjects") 
.ToList(); 

更新:

當你使用這個方法,你只需要確定的路徑你想獲取更新的問題,你可以使用這個:

var MainClassObjects = context.MainClassObjects 
.Include("FirstLevelObjects.SecondLevelObjectsA") 
.Include("FirstLevelObjects.SecondLevelObjectsB") 
.ToList(); 
+0

事實上,如果你使用行Include(「FirstLevelObjects.SecondLevelObjects」) 你甚至不需要使用Include(「FirstLevelObjects」) – ElDog

+0

我有點不確定,謝謝你的澄清。 – VahidNaderi

+0

我甚至曾嘗試過,但它根本沒有工作。我甚至不能只包含FirstLevelObjects。也許我錯過了一些東西,我會再試一次。 – tafkab76

1

試試這個:

using (var context = new SampleContext()) 
{ 
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects.SelectMany(s => s.SecondLevelObjects)).ToList(); 

// ...move objects from the context to program logic... 

} 

您應該添加.Select()語句來得到一個對象或列表。

+0

這個工程到目前爲止,謝謝! '.SelectMany()'給出了一個ArgumentException,儘管'SecondLevelObjects'是一個列表。 '.Select'完成這項工作。但現在我面臨另一個問題:我如何在一個類中包含兩個「List-Properties」? (上面的問題已更新) – tafkab76

+0

我的不好,它也應該是'.Select()'列表。答案已更新。 – Loetn