当不存在显式关系时,使用实体框架请求父子对象集合



我有两个类,如下所示它们是我们用来访问数据库的POCO类,我们使用代码优先的方法,并使用ApplicationEntityConfiguration显式配置实体和DB表之间的所有映射。

 public class Group
{
    public string Code { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
    public string Code { get; set; }
    public string Name { get; set; }
    public virtual Group ParentGroup { get; set; }
}

群体和儿童之间的关系并不明确。没有外键。逻辑关系由代码定义,组应包含所有具有与父组相同代码的代码的项目

Context.Items.Where(x => x.Code.StartsWith(parentGroup.Code));

我需要向调用者方法返回数据库中所有组的集合,以及每个组的所有子级。当请求数据时,我可以请求Context.Groups,并使用Where为每个Group请求Items。我在数据库中有50多个组和1000多个项目因此,这种手动方法将导致对数据库的50多次查询,并将对的性能产生影响

更理想的解决方案是请求一个集合中的所有Group,然后请求另一个集合的所有Item,然后当所有这些数据都在内存中时,为每个组填充一个Items集合。。。那么它不会对DB造成太大影响。

因此,虽然我能够实现总体目标,但我想知道是否有一个更优雅的解决方案,我们可以声明地告诉Enity Framework,组和项之间的关系是使用表达式建立的。其中(x=>x.Code.StartsWith(parentGroup.Code)),然后一旦声明,当开发人员想要将组和项一起加载时,可以使用Include(),或者依赖于可以在访问子项时加载子项的Lazy加载没有比第二种方法更好的方法了。这是因为实体框架只能加载与父级PK具有外键关系的集合。目前还不支持关联到唯一索引。

同样,您所指的流程,关系修复,只有在映射了关联时才能工作。但在您的情况下,它无法映射,因此EF无法填充集合本身。

最新更新