繁体   English   中英

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

[英]Use Entity Framework to request parent-child object collection when no explicit relationship exists

我有2个类,请参见下文,它们是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,并且对于每个Group,都可以使用Where来请求Item。 我在数据库中有50多个组和1000多个项目,因此这种手动方法将导致对数据库的查询超过50个,并且会对性能产生影响

更好的解决方案是请求一个集合中的所有Group,然后再请求另一个集合中的所有Item,然后在内存中存储所有这些数据时,为每个组填充一个Items集合……那么这不会对数据库造成很大的影响。

因此,虽然我总体上可以实现目标,但我想知道是否存在一个更优雅的解决方案,在该解决方案中,我们可以声明性地告诉Enity Framework使用表达式.Where(x => x.Code.StartsWith (parentGroup.Code)),然后在声明后,开发人员可以在希望将组和项目一起加载时使用Include(),也可以依赖于懒惰加载来在访问子项时加载它们

没有比第二种方法更好的方法了。 这是因为实体框架只能加载与父级PK具有外键关系的集合。 尚不支持与唯一索引的关联。

同样,您所指的过程“ 关系修正”仅在映射关联时才有效。 但是在您的情况下,它无法映射,因此EF无法填充集合本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM