Skip to content
FreeSql 官方文档FreeSql 官方文档
指南
扩展
服务支持
github icon
  • 指南

      • Code First
        • 实体特性✨
          • 流式接口
            • 自定义特性
              • 类型映射
                • 导航属性 ✨
                  • OneToOne 一对一
                    • ManyToOne 多对一
                      • OneToMany 一对多
                        • Parent 父子
                          • ManyToMany 多对多
                        • DB First
                          • 表达式函数
                            • 事务
                              • 过滤器
                                • ADO
                                  • AOP✨
                                    • 读写分离
                                      • 分表分库
                                        • 多租户
                                          • 性能
                                            • 你不知道的功能 ✨

                                            导航属性 ✨

                                            author iconnicyecalendar icon2021年2月5日timer icon大约 3 分钟word icon约 804 字

                                            此页内容
                                            • OneToOne 一对一
                                            • ManyToOne 多对一
                                            • OneToMany 一对多
                                            • Parent 父子
                                            • ManyToMany 多对多

                                            # 导航属性 ✨

                                            导航属性是 FreeSql 的特色功能之一,可通过约定配置、或自定义配置对象间的关系。

                                            导航属性有 OneToMany, ManyToOne, ManyToMany, OneToOne, Parent, PgArrayToManyopen in new window 六种配置关系。

                                            有了导航属性,多表查询会非常方便,lambda 表达式中直接使用导航对象点点点,舒服!!

                                            • 可约定(命名约定),可不约定(需指定 Navigate 特性关联);
                                            • 无关联的,查询时可以指明 On 条件,LeftJoin(a => a.Parent.Id == a.ParentId);
                                            • 已关联的,直接使用导航对象就行,On 条件会自动附上;

                                            《导航属性【到底】可以解决什么问题?》open in new window

                                            预热说明:导航属性加载,因为要解决死循环引用问题,当引用关系很复杂的时候,有可能导致首次使用导航属性失败,第二次就可以了。解决办法可以程序启动时就预热所有实体类,循环执行 fsql.Select<object>().AsType(实体类);

                                            # 自定义导航关系

                                            //导航属性,OneToMany
                                            [Navigate(nameof(song_tag.song_id))]
                                            public virtual List<song_tag> Obj_song_tag { get; set; }
                                            //在 song_tag 查找 song_id 属性,与 本实体.主键 关联
                                            
                                            //导航属性,ManyToOne/OneToOne
                                            [Navigate(nameof(song_id))]
                                            public virtual Song Obj_song { get; set; }
                                            //在 本实体 查找 song_id 属性,与 Song.主键 关联
                                            
                                            //导航属性,ManyToMany
                                            [Navigate(ManyToMany = typeof(tag_song))]
                                            public virtual List<tag> tags { get; set; }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13

                                            也可以使用 FluentApi 在外部设置导航关系:

                                            fsql.CodeFirst.ConfigEntity<实体类>(a => a
                                                .Navigate(b => b.roles, null, typeof(多对多中间实体类))
                                                .Navigate(b => b.users, "uid")
                                            );
                                            
                                            1
                                            2
                                            3
                                            4

                                            优先级,特性 > FluentApi

                                            注意:

                                            1、属性设置 Column(IsIgnore = true) 后,导航属性会失效

                                            2、Navigate 设置的字符串是 类属性名,不是表 字段名!!!

                                            # 检测导航属性

                                            如何检测一个导航属性是否配置生效:

                                            var tbref = fsql.CodeFirst
                                                .GetTableByEntity(typeof(T))
                                                .GetTableRef("Children", true);
                                            
                                            1
                                            2
                                            3

                                            GetTableRef(string propertyName, bool isThrow);

                                            # 约定命名(无须指明 Navigate)

                                            # OneToOne 一对一

                                            class User {
                                                public int Id { get; set; } //Id、UserId、User_id
                                            
                                                public UserExt UserExt { get; set; }
                                            }
                                            
                                            class UserExt {
                                                public int id { get; set; } //Id、UserId、User_id、UserExtId、UserExt_id
                                            
                                                public User User { get; set; }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11

                                            《OneToOne 一对一,怎么添加数据?》open in new window

                                            # ManyToOne 多对一

                                            class Group {
                                                public int Id { get; set; } //Id、GroupId、Group_id
                                            }
                                            
                                            class User {
                                                public int Id { get; set; } //Id、UserId、User_id
                                            
                                            
                                                public int AGroupId { get; set; }
                                                public Group AGroup { get; set; }
                                            
                                                public int BGroupId { get; set; }
                                                public Group BGroup { get; set; }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13
                                            14

                                            # OneToMany 一对多

                                            class Group {
                                                public int Id { get; set; } //Id、GroupId、Group_id
                                            
                                                public ICollection<User> AUsers { get; set; }
                                                public ICollection<User> BUsers { get; set; }
                                            }
                                            
                                            class User {
                                                public int Id { get; set; } //Id、UserId、User_id
                                            
                                            
                                                public int AGroupId { get; set; }
                                                public Group AGroup { get; set; }
                                            
                                                public int BGroupId { get; set; }
                                                public Group BGroup { get; set; }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13
                                            14
                                            15
                                            16
                                            17

                                            《OneToMany 一对多,怎么添加数据?》open in new window

                                            # Parent 父子

                                            class Group {
                                                public int Id { get; set; } //Id、GroupId、Group_id
                                            
                                                public int ParentId { get; set; } //ParentId、Parent_id
                                                public Group Parent { get; set; }
                                            
                                                public ICollection<Group> Childs { get; set; }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8

                                            父子关系,与一对多其实差不多,添加数据参数上面的连接;

                                            # ManyToMany 多对多

                                            class Song {
                                                [Column(IsIdentity = true)]
                                                public int Id { get; set; }
                                                public string Title { get; set; }
                                            
                                                public virtual ICollection<Tag> Tags { get; set; }
                                            }
                                            class Song_tag {
                                                public int Song_id { get; set; }
                                                public virtual Song Song { get; set; }
                                            
                                                public int Tag_id { get; set; }
                                                public virtual Tag Tag { get; set; }
                                            }
                                            class Tag {
                                                [Column(IsIdentity = true)]
                                                public int Id { get; set; }
                                                public string Name { get; set; }
                                            
                                                public int? Parent_id { get; set; }
                                                public virtual Tag Parent { get; set; }
                                            
                                                public virtual ICollection<Song> Songs { get; set; }
                                                public virtual ICollection<Tag> Tags { get; set; }
                                            }
                                            
                                            1
                                            2
                                            3
                                            4
                                            5
                                            6
                                            7
                                            8
                                            9
                                            10
                                            11
                                            12
                                            13
                                            14
                                            15
                                            16
                                            17
                                            18
                                            19
                                            20
                                            21
                                            22
                                            23
                                            24
                                            25

                                            Song、Tag、Song_tag,这三个实体使用了 OneToMany、ManyToOne、Parent、ManyToMany 4 种关系。

                                            edit icon在 GitHub 上编辑此页open in new window
                                            上次编辑于: 2022/6/13 下午11:02:40
                                            贡献者: igeekfan,2881099,luoyunchong
                                            上一页
                                            类型映射
                                            Copyright © 2018-present nicye
                                            Copyright © 2022 nicye

                                            该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                                            详情