How to Include a Child Object's Child Object in Entity Framework 5
I Am Using Entity Framework 5 Code First and Asp. Net Mvc 3. I Am Struggling to Get a Child Object's Child Object to Populate. Below Are My Classes...
I am using Entity Framework 5 code first and ASP.NET MVC 3.
I am struggling to get a child object's child object to populate. Below are my classes..
Application class;
public class Application
{
// Partial list of properties
public virtual ICollection<Child> Children { get; set; }
}
Child class:
public class Child
{
// Partial list of properties
public int ChildRelationshipTypeId { get; set; }
public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}
ChildRelationshipType class:
public class ChildRelationshipType
{
public int Id { get; set; }
public string Name { get; set; }
}
Part of GetAll method in the repository to return all the applications:
return DatabaseContext.Applications
.Include("Children");
The Child class contains a reference to the ChildRelationshipType class. To work with an application's children I would have something like this:
foreach (Child child in application.Children)
{
string childName = child.ChildRelationshipType.Name;
}
I get an error here that the object context is already closed.
How do I specify that each child object must include the ChildRelationshipType object like what I did above?
4 Answers
If you include the library System.Data.Entity you can use an overload of the Include() method which takes a lambda expression instead of a string. You can then Select() over children with Linq expressions rather than string paths.
return DatabaseContext.Applications
.Include(a => a.Children.Select(c => c.ChildRelationshipType));
With EF Core in .NET Core you can use the keyword ThenInclude :
return DatabaseContext.Applications
.Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);
Include childs from childrens collection :
return DatabaseContext.Applications
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);
I ended up doing the following and it works:
return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");
A good example of using the Generic Repository pattern and implementing a generic solution for this might look something like this.
public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)
{
foreach (var include in includeProperties)
{
query = query.Include(include);
}
return query.ToList();
}