【发布时间】:2010-11-21 10:40:14
【问题描述】:
我有一个Item。 Item 有一个 Category。
Category 有 ID、Name、Parent 和 Children。 Parent 和 Children 也属于 Category。
当我对特定的Item 执行 LINQ to Entities 查询时,它不会返回相关的Category,除非我使用Include("Category") 方法。但它并没有带来完整的类别,包括它的父母和孩子。我可以做Include("Category.Parent"),但是这个对象有点像一棵树,我有一个递归层次结构,我不知道它在哪里结束。
如何让 EF 完全加载 Category,带有父子和子,以及父子及其父子,等等?
这不是整个应用程序的东西,出于性能考虑,它只需要这个特定实体,即类别。
【问题讨论】:
-
如果它是递归的,那么它可以(很容易)有一个循环。您必须选择最大深度。完成后,您可以为其编写查询。
-
不,不允许循环。业务层将此视为一棵树,父级没有机会将子级添加为父级。
-
如果不允许循环,那么最好的关系模型可能是嵌套集。不过,这取决于您的应用程序。 NS 主要用于查询,FK 主要用于插入/更新/删除。但映射会完全不同。
-
不知道需要换机型。但是在进行主要选择时,嵌套集的速度要快得多。 RDBMS 通常要么 (1) 根本不支持层次结构(例如,SQL 2005),要么 (2) 在某种程度上具有它,但不在其 EF 提供程序中公开它(例如,SQL 2008)。您要求 EF 支持 DB 在直接 SQL 中无法执行的操作! (想一想:什么 SQL 语句会返回无限深度的 JOINed 行?) EF 中的急切加载通过更改 SQL 语句来工作。什么样的 SQL 语句会产生你想要的结果集?
-
仅仅因为你的实现不允许循环,你正在使用的数据结构可以。因此 EF 不能让您急切地加载树。相反,您需要在需要相关项目时显式调用 Load。或者,您可以将表加载为平面集合并手动重新构建树。虽然这会向数据库发出单个读取请求,但管理更新变得更加棘手。
标签: c# visual-studio-2008 entity-framework