EF架构~单表一对多集合的插入(树型结构)

简介:

单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动为我们确实上级ID,对于操作的性能也是可以接受的,与数据库建立一次链接,发一批指定,这是我们可以接受的,虽然在性能上不是最佳的,但综合对比来看,它即是最佳的。(结合对比=程序性能+开发人员工时+程序扩展性+程序可读性)

OK,我们以菜单表为例,说一下这个菜单表初始化的过程

对于菜单实体的赋值,看一下代码:

var menu = new WebManageMenus
                {
                    About = string.Empty,
                    LinkUrl = string.Empty,
                    MenuLevel = 0,
                    MenuName = form["MenuName"] ?? "",
                    Operator = string.Empty,
                    ParentID = null,
                    SortNumber = 1,
                    Status = Status.Normal.GetHashCode(),
                    UpdateDate = DateTime.Now,
                    WebManageMenus1 = new List<WebManageMenus>
                     {
                        new WebManageMenus
                        {
                            About = string.Empty,
                            LinkUrl = string.Empty,
                            MenuLevel = 1,
                            MenuName ="系统管理",
                            Operator = string.Empty,
                            SortNumber = 1,
                            Status = Status.Normal.GetHashCode(),
                            UpdateDate = DateTime.Now,
                            WebManageMenus1 = new List<WebManageMenus>
                             {
                                #region 二级菜单
                                new WebManageMenus
                                {
                                    About = string.Empty,
                                    LinkUrl = string.Empty,
                                    MenuLevel = 2,
                                    MenuName ="角色管理",
                                    Operator = string.Empty,
                                    SortNumber = 1,
                                    Status = Status.Normal.GetHashCode(),
                                    UpdateDate = DateTime.Now,
                                    WebManageMenus1 = new List<WebManageMenus>
                                    {
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/Role/Create",
                                            MenuLevel = 3,
                                            MenuName ="新建角色",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        },
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/Role/Index",
                                            MenuLevel = 3,
                                            MenuName ="管理角色",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        }      
                                  }
                                }, 
                                #endregion
                                #region 二级菜单
                                new WebManageMenus
                                {
                                    About = string.Empty,
                                    LinkUrl = string.Empty,
                                    MenuLevel = 2,
                                    MenuName ="部门管理",
                                    Operator = string.Empty,
                                    SortNumber = 1,
                                    Status = Status.Normal.GetHashCode(),
                                    UpdateDate = DateTime.Now,
                                    WebManageMenus1 = new List<WebManageMenus>
                                    {
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/Department/Index",
                                            MenuLevel = 3,
                                            MenuName ="管理部门",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        }    
                                   }
                                }, 
                                #endregion
                                #region 二级菜单
                                new WebManageMenus
                                {
                                    About = string.Empty,
                                    LinkUrl = string.Empty,
                                    MenuLevel = 2,
                                    MenuName ="菜单管理",
                                    Operator = string.Empty,
                                    SortNumber = 1,
                                    Status = Status.Normal.GetHashCode(),
                                    UpdateDate = DateTime.Now,
                                    WebManageMenus1 = new List<WebManageMenus>
                                    {
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/Menu/Index",
                                            MenuLevel = 3,
                                            MenuName ="管理菜单管理",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        }    
                                   }
                                }, 
                                #endregion
                                #region 二级菜单
                                new WebManageMenus
                                {
                                    About = string.Empty,
                                    LinkUrl = string.Empty,
                                    MenuLevel = 2,
                                    MenuName ="员工管理",
                                    Operator = string.Empty,
                                    SortNumber = 1,
                                    Status = Status.Normal.GetHashCode(),
                                    UpdateDate = DateTime.Now,
                                    WebManageMenus1 = new List<WebManageMenus>
                                    {
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/User/Create",
                                            MenuLevel = 3,
                                            MenuName ="新建员工",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        },
                                        new WebManageMenus
                                        {
                                            About = string.Empty,
                                            LinkUrl = "/User/Index",
                                            MenuLevel = 3,
                                            MenuName ="管理员工",
                                            Operator = string.Empty,
                                            SortNumber = 1,
                                            Status = Status.Normal.GetHashCode(),
                                            UpdateDate = DateTime.Now
                                        }      
                                  }
                                }, 
                                #endregion
                             }
                       }
                   }
                };
                MenuRepository.Insert(menu);

我们可以看到,赋值的过程,我采用的EF生成的实体标准,对于子对象的赋值,我们可以看到,parentID并没有赋值,因为这时它还没不存在,这个parentID为上级

菜单的主键ID,所以EF在插入完父菜单后,会自动将ID赋值子对象的ParentID,这个过程是系统帮我们完成的。

对于上面的过程,所生成的SQL语句也是我们可以接受的

感谢您的阅读,感谢Entity Framework开发团队!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~单表一对多集合的插入(树型结构),如需转载请自行联系原博主。

目录
相关文章
|
存储 算法
集合架构-Set
集合架构-Set
126 0
|
9月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
12月前
|
Java 网络安全 开发工具
Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
通过本文,读者可以深入了解Git的核心概念和实际操作技巧,提升版本管理能力。
|
编解码 人工智能 文件存储
卷积神经网络架构:EfficientNet结构的特点
EfficientNet是一种高效的卷积神经网络架构,它通过系统化的方法来提升模型的性能和效率。
565 1
|
存储 前端开发 数据库
一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
【10月更文挑战第21天】本文介绍了 SaaS 应用服务的多租户服务、安全服务和更新与维护服务,以及 SaaS 应用的前后端结构和交互设计。多租户服务涉及数据隔离和资源分配;安全服务包括身份认证与授权及数据安全;更新与维护服务涵盖版本管理和技术支持。前端结构关注用户界面设计和前端技术选型;后端结构则涉及微服务架构和数据库管理。交互设计强调租户与应用的交互和应用内部模块间的交互。
1231 0
画好一张架构图/业务图/流程图问题之如何让图结构更清晰问题如何解决
画好一张架构图/业务图/流程图问题之如何让图结构更清晰问题如何解决
229 1
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
285 3
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
417 0
|
Kubernetes Cloud Native API
云原生技术专题 | 深入浅出分析云原生微服务的技术结构和架构设计
云原生技术专题 | 深入浅出分析云原生微服务的技术结构和架构设计
881 0
|
存储 缓存 物联网
DP读书:鲲鹏处理器 架构与编程(二)服务器与处理器——高性能处理器的并行组织结构、ARM处理器
DP读书:鲲鹏处理器 架构与编程(二)服务器与处理器——高性能处理器的并行组织结构、ARM处理器
539 0