我正在计划一个将使用Asp.net MVC 3和Entity Framework 4 Code-First的项目。当我写原型时,我发现了问题。如何在EF4中映射树?我不这么认为:
class AmazingEntity
{
public int AmazingEntityId;
public AmazaingEntity Parent;
public IList<AmazingEntity> Children;
}
易于维护和高效。我该如何正确地做到这一点(最好是使用MSSQL的原生HierarchyID或某种其他有效的树映射方法。
提前致以最诚挚的问候和谢意,
PawełŁuczkiewcz。
答案 0 :(得分:3)
实体框架仅提供您描述的方式,因为这是对象世界中树结构的正确实现。如果要使用任何特定于数据库的功能,则应决定将它们包装在自定义数据库视图中并映射这些视图。这种方法的问题是视图将是只读的,因此您仍然需要提到的实体来修改树。
几乎每次我需要进行与hieararchy遍历相关的任何查询时,我在自定义视图或存储过程中使用CTE并在EF中使用此SQL构造。这只是EF无法有效处理的事情。
正如您所看到的,这些功能中的非实际上与代码第一种方法相对应。纯代码首先不允许使用任何特定于数据库的功能(除非您在自定义数据库初始化程序中手动添加它们)。代码优先使用您定义的实体并创建自引用一对多关系。这就是全部。在代码优先中,您不能指望任何特定于数据库的功能或隐藏的数据库逻辑,因为这是您无法在映射中指定的内容。
代码优先是针对您希望快速定义对象结构并让EF为您创建数据库的情况。如果您想对数据库及其设计方式做出任何决定,则必须先恢复数据库。