1

我有 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; }
}

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

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

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

更优化的解决方案是请求一个集合中的所有组,然后请求另一个集合中的所有项目,然后当所有这些数据在内存中时,为每个组填充一个项目集合......然后它不会对数据库产生很多影响。

所以,虽然我总体上能够实现目标,但我想知道是否有更优雅的解决方案,我们可以声明性地告诉 Enity Framework 组和项目之间的关系是使用表达式建立的 .Where(x => x.Code.StartsWith (parentGroup.Code)) ,然后一旦它被声明,开发人员可以在他想要一起加载组和项目时使用 Include() 或者依赖延迟加载可以在子项目被访问时加载它们

4

1 回答 1

1

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

同样,您所指的过程,关系修复,只能在关联被映射时工作。但在你的情况下,它不能被映射,所以 EF 不能自己填充集合。

于 2013-07-15T09:43:46.073 回答