.net - 如何在 Entity Framework 中为树层次结构建模?

标签 .net sql-server-2008 entity-framework

我的任务是构建一个模拟虚拟文件系统的新系统。我的客户要求使用 Entity Framework 构建它。我以前处理过类似节点的数据结构,但从未使用 Entity Framework 。

在 Entity Framework 中构建分层类的最佳方法是什么?所谓分层,我的意思是一个类可以有一个相同类型的父级,并且可以有零个或多个相同类型的子级。

我使用的是 SQL Server 2008 和 Entity Framework 4.0。我应该使用内置的层次结构数据类型,还是使用 ParentID 路由?欢迎提出建议。

最佳答案

我遇到了同样的问题。我发现使用 hierarchyid 数据类型并仍在使用 EF 4.0 的最佳方法是在层次结构表上构建 View 。

由于 View 不可更新,我创建了删除、插入和添加存储过程,并将它们映射到 ORM 中的实体映射。这真的很好用。

假设你有这张 table :

CREATE TABLE [dbo].[NodeHierarchy]
(
[Node] hierarchyid NOT NULL,
[NodeId] int NOT NULL,
[Level] AS ([Node].[GetLevel]()) PERSISTED,
[Lineage] AS ([Node].[ToString]()) PERSISTED,
[RootNode] AS ([Node].[GetAncestor]([Node].[GetLevel]() - 1)) PERSISTED,
[ParentNode] AS ([Node].[GetAncestor](1)) PERSISTED
)

现在你在它上面创建这个 View :

CREATE VIEW [dbo].[NodeHierarchyView]
AS
SELECT   ch.NodeId AS [NodeId],
       ch.Node.ToString() AS [Lineage],
 ch.[Level] AS [Level],
 chr.Node.ToString() AS [RootLineage],
 chr.NodeId AS [RootNodeId],
 chp.Node.ToString() As [ParentLineage],
 chp.NodeId AS [ParentNodeId]
FROM     dbo.NodeHierarchy ch
 LEFT OUTER JOIN NodeHierarchy chr ON
      ch.RootNode = chr.Node
 LEFT OUTER JOIN CompanyHierarchy chp ON
      ch.ParentNode = chp.Node

现在我可以在 View 上的模型中创建一个实体并使用 Linq-to-Entities 并获得良好的性能和简洁的代码。

这是我使用的添加存储过程:

CREATE PROCEDURE [dbo].[AddNode]
@NodeId int,
@ParentNodeId int
AS
DECLARE @NewNode hierarchyid;
DECLARE @ParnetLineage nvarchar(4000);

SELECT  @ParnetLineage = Lineage
FROM    NodeHierarchy
WHERE   NodeId = @ParentNodeId

IF @ParnetLineage IS NULL
BEGIN
    SET @ParnetLineage = N'/';
END

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
    SET @NewNode = CAST(@ParnetLineage + CAST(@NodeId AS nvarchar (4000)) + N'/' AS hierarchyid);

    INSERT NodeHierarchy (Node, NodeId)
    VALUES (@NewNode, @NodeId)
COMMIT

SELECT @NodeId AS [NewNodeId]
RETURN 0

我在表上创建了所有需要的索引和约束。在我的解决方案中, View 显示来自其他表的数据,并且过程也处理这些表。

奥德

关于.net - 如何在 Entity Framework 中为树层次结构建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276785/

相关文章:

c# - 外键约束问题?

c# - 环境包括与环境名称属性之间的差异

SQL Server 2000 与 SQL Server 2008 查询性能

c# - 如何使动态添加的按钮可点击

sql - 如何在 SQL Server 2008 中获取每组的第一条和最后一条记录?

用于查找订单最后一个事件状态的 SQL 查询

entity-framework - Entity Framework CTP5(代码优先)建模 - 查找表

c# - EF 使用和 BeginTransaction,何时调用 Connection.Close()?

c# - 以编程方式确定系统是否具有可切换图形

c# - 默认构造函数创建的 `Dictionary`是否使用哈希码?