2014-10-16 3 views
1

У меня есть три класса, которые выглядят следующим образом. Я назову их родителями, детьми и внуками.Яркая загрузка объекта grandchild с Entity Framework 6

public class Parent 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual List<Child> Children {get;set;} 
    public virtual List<Grandchild> Grandchildren {get;set;} 
} 

public class Child 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual Parent Parent {get;set;} 
    public virtual List<Grandchild> Grandchildren {get;set;} 
} 

public class Grandchild 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual Parent Parent {get;set;} 
    public virtual Child Child {get;set;} 
} 

Теперь я использую шаблон репозитория с EF6. Для метода захвата для родителей, у меня есть что-то вроде следующего:

public List<Parent> GrabParent(Expression<Func<Parent, bool>> predicate) 
{ 
    return _context.Parents 
    .Include(a => a.Children) 
    .Include(a => a.Grandchildren) 
    .Where(predicate) 
    .ToList(); 
} 

я использую аналогичный метод, чтобы захватить Grandchild записи:

public List<Grandchild> GrabGrandchildren(Expression<Func<Grandchild, bool>> predicate) 
{ 
    return _context.Grandchildren 
    .Include(a => a.Parent) 
    .Include(a => a.Child) 
    .Where(predicate) 
    .ToList(); 
} 

Теперь, если я вызвать метод GrabParent , Я бы получил список родителей и список каждого из детей. Однако я не смог бы получить доступ к каким-либо записям внуков, несмотря на то, что они были связаны с каждой из записей «Дети», к которым я имею доступ.

Аналогичным образом, если я вызову метод GrabGrandchildren, я смогу получить список внуков и информацию о Ребенке, но я не смог бы получить информацию о Родительском.

Почему это и как я могу получить дополнительную информацию?

ответ

2

См. EF code-first: How to load related data (parent-child-grandchild)? для получения пояснения.

По существу, я бы изменить метод GrabGrandchildren к следующему:

public List<Grandchild> GrabGrandchildren(Expression<Func<Grandchild, bool>> predicate) 
{ 
    return _context.Grandchildren 
    .Include(a => a.Child) 
    .Include(a => a.Child.Select(b => b.Parent) 
    .ToList(); 
} 
+0

Для ядра EF, следует использовать следующий синтаксис: http://stackoverflow.com/a/38741905/1047812 –