如何在实体框架5中包含子对象的子对象

我正在使用 Entity Framework 5 code firstASP.NET MVC 3

我正在努力让一个子对象的子对象填充。

申请类别;

public class Application
{
// Partial list of properties


public virtual ICollection<Child> Children { get; set; }
}

儿童班:

public class Child
{
// Partial list of properties


public int ChildRelationshipTypeId { get; set; }


public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

儿童关系类别:

public class ChildRelationshipType
{
public int Id { get; set; }


public string Name { get; set; }
}

GetAll 方法的一部分,以返回所有应用程序:

return DatabaseContext.Applications
.Include("Children");

Child 类包含对 ChildRelationshipType 类的引用。如果要使用应用程序的子代,我可以使用下面的代码:

foreach (Child child in application.Children)
{
string childName = child.ChildRelationshipType.Name;
}

我在这里得到一个错误,即对象上下文已经关闭。

如何指定每个子对象必须包含 ChildRelationshipType对象,就像我上面所做的那样?

149298 次浏览

如果包含库 System.Data.Entity,则可以使用 Include()方法的重载,该方法采用 lambda 表达式而不是字符串。然后,您可以使用 Linq 表达式而不是 string路径在子级上执行 Select()

return DatabaseContext.Applications
.Include(a => a.Children.Select(c => c.ChildRelationshipType));

我最后做了以下几件事,而且很有效:

return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");

使用 GenericRepository 模式并为此实现通用解决方案的一个很好的示例可能类似于下面的内容。

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)


{


foreach (var include in includeProperties)
{


query = query.Include(include);
}


return query.ToList();
}

使用.NET Core 中的 EF Core,你可以使用关键字 ThenInclude:

return DatabaseContext.Applications
.Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

包括儿童收集的儿童:

return DatabaseContext.Applications
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);