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

如果您映射此表与实体框架您将自动获得一个树状结构,您需将关系字段重命名,因为他们被命名为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. 淘宝npm镜像使用

    淘宝NPM镜像使用 镜像使用方法 1.config命令 npm config set registry https://registry.npm.taobao.org npm info undersc ...

  2. Epub格式的电子书——文件组成

    epub格式电子书遵循IDPF推出的OCF规范,OCF规范遵循ZIP压缩技术,即epub电子书本身就是一个ZIP文件,我们将epub格式电子书的后缀.epub修改为.zip后,可以通过解压缩软件(例如 ...

  3. select rows by values in a column from Dataframe

    df.loc[df['column_name'] == some_value] details in: http://stackoverflow.com/questions/17071871/sele ...

  4. sysbench 1.0.9 mysql 压测工具安装使用

    备注:    安装比较简单,可以使用源码或者使用yum 进行安装,本次测试使用yum    注意1.0 之后版本与老版本改动比较大,好多地方都有修改,本次测试使用    的mysql 使用docker ...

  5. drill 数据库查询方式简单说明

    1. mysql   select * from mysql-storage.mysqldb.mysqltable   2. oracle    select * from oracle-storag ...

  6. spring容器启动

    1 主要类 ContextLoaderListener:注册在web.xml中,web应用启动时,会创建它,并回调它的initWebApplicationContext()方法,从而创建并启动spri ...

  7. angular中的ng-bind-html和$sce服务

    输入的内容存储在数据库中,然后再在数据库中将这些数据读写到页面上,比如你使用了某个第三方的脚本或者库.加载了一段html等等,可能会多了一些css的样式(显示在界面上) 这个时候我们可以利用angul ...

  8. MEF学习总结(3)---Attribute Model Programing

    上一片介绍了Primitive层,Attribute Model可以认为是对Primitive的上层实现.主要包括如下内容: 1. 一系列的Attribute来定义Import和Export 常用的有 ...

  9. Spring Framework中常见的事务传播陷阱(译文)

    最近看到Medium上一篇讨论Spring Framework中事务传播的文章,解释了几种常见的问题,解释的不错,这里直接翻译吧(意译为主,粗体和斜体是我自己加上的). 译文: 这是我的第一篇文章,我 ...

  10. PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...