我正在使用 Entity Framework 5 code first
和 ASP.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; }
}
ChildRelationshipType 类:
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
对象,就像我在上面所做的那样?
如果包含库 System.Data.Entity
,则可以使用 Include()
方法的重载,该方法采用 lambda 表达式而不是字符串。然后,您可以使用 Linq 表达式而不是 string
路径来Select()
覆盖子项。
return DatabaseContext.Applications
.Include(a => a.Children.Select(c => c.ChildRelationshipType));
使用 .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);
我最终做了以下事情并且它有效:
return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");
使用通用存储库模式并为此实现通用解决方案的一个很好的例子可能看起来像这样。
public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)
{
foreach (var include in includeProperties)
{
query = query.Include(include);
}
return query.ToList();
}
System.Data.Entity;
的引用Microsoft.Data.Entity