2014-01-17 6 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" -Объекты:

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... 

} 

Это даже возможно, или я должен адаптировать DbSets в DbContext?

ответ

2

Одним из решений может быть использование включать другие перегрузки метода, который принимает строку, как это:

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

Update:

Когда вы используете этот метод, нужно просто определить пути вы хотите получить это для обновленного вопроса, вы можете использовать это:

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' выполняет эту работу. но теперь я столкнулся с другой проблемой: как включить два «свойства списка» в один класс? (Вопрос выше обновлен) – tafkab76

+0

Неплохо, это также должно быть '.Select()' для списка. Ответ обновлен. – Loetn

Смежные вопросы