一、什么是自引用
1.在常见的树状目录中,其结构如下:

每一个菜单可能有父级菜单,也可能有子菜单。但是无论是哪一级菜单,他们都是同属于菜单对象。将这个菜单对象使用代码进行描述:

在上面的代码中,主体实体是Menus,但是其依赖实体依旧还是Menus,且导航属性Menus与List<Menus>均指向自己,也就是“自己引用自己”,在数据库中形成了“自连接”关系。此之谓“自引用”。
二、自引用代码环境搭建
1.在EF Core中对这个实体的关系进行详细配置,即一个节点只能指向一个父节点,但是可以含有若干个子节点。注意Parent在这里可以为空。其配置类如下:

将实体类型显式的标记出来:

配置DbContext:

然后直接执行Add-Migration,生成对应的Migration文件。紧接着执行Update-database会报如下错误(EF Core 6.0+,本例是EF Core 8.0):

解决方案是找到刚刚生成的Migrations文件夹中对应的迁移文件,找到constraints配置项,删掉onDelete配置:

然后保存并编译代码,重新执行Update-database:

迁移成功。打开数据库查看外键属性:可以看到这个外键由Menus指向Menus,即自引用。

三、测试自引用关系
1.新增菜单实体:

若没有将外键Menus Parent声明为可空:

执行:

解决方案:将外键Menus声明为可空即可避免:
运行:

数据库:

2.递归打印子节点

运行:

