很多时候您需要在数据库中存储逻辑树的层次结构。这个问题有很多种实现方式,但最常见的是使用一个简单自关联的表,如下图所示

如果您映射此表与实体框架您将自动获得一个树状结构,您需将关系字段重命名,因为他们被命名为Employee和 Employee1,将他们重命名微Parent和Childs,这样使结构更清晰和易于理解。

现在我创建一个简单控制台应用程序,以递归的方式打印整棵树,代码如下:

public static void Print(Employee employee, Int32 level)
{
Console.WriteLine("{0}{1}", new String('-', level), employee.Name);
if (!employee.Childs.IsLoaded)
{
employee.Childs.Load();
} foreach (Employee child in employee.Childs)
{
Print(child, level + 1);
}
}

上面的Print方法以递归的方式打印整棵树的所有节点,接下来在main方法中调用该方法

public static void Main()
{
Console.WriteLine("Test");
using (TestEntities context = new TestEntities())
{
Employee root = context.Employee
.Where(e => e.Parent == null).First();
Print(root, 0);
}
}

实体框架在内存中构建整个树,输出结果如下:

Test
Alkampfer
-Guardian
--Clark
--John
-Joe

修改树的结构很简单,你只需要修改它的父节点就可以了。代码如下:

Employee Clark = context.Employee
.Where(e => e.Name == "Clark").First();
Employee Joe = context.Employee
.Where(e => e.Name == "Joe").First();
Clark.Parent = Joe;

删除节点时有点麻烦,因为删除包含子节点的节点时,EF会报告异常。所以最好的做法是建立一个方法遍历所有子节点。

public static void Visit(Employee employee, Action<Employee> visitAction)
{
visitAction(employee);
if (!employee.Childs.IsLoaded)
employee.Childs.Load();
foreach (Employee child in employee.Childs)
Visit(child, visitAction);
}

调用以上方法,遍历所有子节点完成删除。

using (TestEntities context = new TestEntities())
{
Employee root = context.Employee
.Where(e => e.Parent == null).First();
List<Employee> nodes = new List<Employee>();
Visit(root, nodes.Add);
nodes.ForEach(context.DeleteObject);
context.SaveChanges();
}

值得注意的是以上方法存在性能问题!

外语水平有限,大家可以直接看原文

原文:http://www.codewrecks.com/blog/index.php/2009/02/27/manage-trees-with-entity-framework/

管理Entity Framework中的树结构的更多相关文章

  1. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  2. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  3. 关于Entity Framework中的Attached报错的完美解决方案终极版

    之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...

  4. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  5. 在Entity Framework中使用事务

    继续为想使用Entity Framework的朋友在前面探路,分享的东西虽然技术含量不高,但都是经过实践检验的. 在Entity Framework中使用事务很简单,将操作放在TransactionS ...

  6. Entity Framework中的多个库操作批量提交、事务处理

    在Entity Framework 中使用SaveChanges()是很频繁的,单次修改或删除数据后调用SaveChanges()返回影响记录数. 要使用批量修改或者批量删除数据,就需要SaveCha ...

  7. LinqToSql和ASP.NET Entity FrameWork 中使用事务

    ASP.NET Entity FrameWork中: int flag = -1; if (this.URPmanagementEntities1.Connection.State != System ...

  8. Lazy<T>在Entity Framework中的性能优化实践

    Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...

  9. Entity framework 中Where、First、Count等查询函数使用时要注意

    在.Net开发中,Entity framework是微软ORM架构的最佳官方工具.我们可以使用Lambda表达式在Entity framework中DbSet<T>类上直接做查询(比如使用 ...

随机推荐

  1. java中守护线程的一些概念和用法

    网上的资料中,守护线程的功能一般都是“只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用是为其他线 ...

  2. BZOJ2431 HAOI2009 逆序对数列 【DP】*

    BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai​,如果有i<j且ai>aja_i>a_jai​>aj​,那么我们称aia ...

  3. WPF 同一窗口内的多线程 UI(VisualTarget)

    WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程.然而,就不能让 ...

  4. 《DSP using MATLAB》示例Example 8.7

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  5. Linux下Apache服务器配置

    Linux下Apache服务器配置 相关包: httpd-2.2.3-29.e15.i386.rpm                 //主程序包 httpd-devel-2.2.3-29.e15.i ...

  6. Sprint第一个冲刺(第八天)

    一.Sprint介绍 完善点餐界面,点击进行跳转. 实验截图: 任务进度: 二.Sprint周期 看板: 燃尽图:

  7. @EnableAutoConfiguration注解原理

    前言 Spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷.比如内嵌的tomcat端口默认配置是8080,这些都属于Spring Boot自动配置的范畴,当然其自动配置相当多. s ...

  8. chrome安装vue-devtools

    安装方法1: 需正常打开chrome商店,搜索vuejs devtools 安装.chrome://extensions/ 开发者工具-扩展程序下启用: 方法2: github下载插件,npm包安装依 ...

  9. bzoj 5120 [2017国家集训队测试]无限之环——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5120 旋转的话相当于去掉一个插头.新增一个插头,所以在这两个插头之间连边并带上费用即可. 网 ...

  10. J2EE项目在weblogic下的改动

    1.struts所有配置文件放到classes根目录下 2〉java.lang.ClassCastException:weblogic.xml.jaxp.RegistryDocumentBuilder ...