实体框架4代码优先与树

时间:2011-04-25 09:45:24

标签: sql-server entity-framework database-design tree entity-framework-4.1

我正在计划一个将使用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。

1 个答案:

答案 0 :(得分:3)

实体框架仅提供您描述的方式,因为这是对象世界中树结构的正确实现。如果要使用任何特定于数据库的功能,则应决定将它们包装在自定义数据库视图中并映射这些视图。这种方法的问题是视图将是只读的,因此您仍然需要提到的实体来修改树。

几乎每次我需要进行与hieararchy遍历相关的任何查询时,我在自定义视图或存储过程中使用CTE并在EF中使用此SQL构造。这只是EF无法有效处理的事情。

正如您所看到的,这些功能中的非实际上与代码第一种方法相对应。纯代码首先不允许使用任何特定于数据库的功能(除非您在自定义数据库初始化程序中手动添加它们)。代码优先使用您定义的实体并创建自引用一对多关系。这就是全部。在代码优先中,您不能指望任何特定于数据库的功能或隐藏的数据库逻辑,因为这是您无法在映射中指定的内容。

代码优先是针对您希望快速定义对象结构并让EF为您创建数据库的情况。如果您想对数据库及其设计方式做出任何决定,则必须先恢复数据库。