类别:学习文档
日期:2021-07-15 浏览:2527 评论:0
导航属性是 FreeSql 的特色功能之一,可通过约定配置、或自定义配置对象间的关系。
导航属性有 OneToMany, ManyToOne, ManyToMany, OneToOne, Parent 五种配置关系。
有了导航属性,多表查询会非常方便,lambda 表达式中直接使用导航对象点点点,舒服!!
可约定(命名约定),可不约定(需指定 Navigate 特性关联);
无关联的,查询时可以指明 On 条件,LeftJoin(a => a.Parent.Id == a.ParentId);
已关联的,直接使用导航对象就行,On 条件会自动附上;
自定义导航关系
//导航属性,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; }
也可以使用 FluentApi 在外部设置导航关系:
fsql.CodeFirst.ConfigEntity<实体类>(a => a .Navigate(b => b.roles, null, typeof(多对多中间实体类)) .Navigate(b => b.users, "uid") );
优先级,特性 > FluentApi
检测导航属性
如何检测一个导航属性是否配置生效:
var tbref = g.sqlite.CodeFirst .GetTableByEntity(typeof(T)) .GetTableRef("Children", true);
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; } }
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; } }
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; } }
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; } }
父子关系,与一对多其实差不多,添加数据参数上面的连接;
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; } }
Song、Tag、Song_tag,这三个实体使用了 OneToMany、ManyToOne、Parent、ManyToMany 4种关系。
系列文章导航
FreeSql (一)入门及安装 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二)自动迁移实体 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三)实体特性 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (四)实体特性 Fluent Api - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (五)插入数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (六)批量插入数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (七)插入数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (八)插入数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (九)删除数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十)更新数据 - 学习文档 - 零一的世界 (vtzw.com)FreeSql (十一)更新数据 Where - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十二)更新数据时指定列 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十三)更新数据时忽略列 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十四)批量更新数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十五)查询数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十六)分页查询 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十七)联表查询 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十八)导航属性 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (十九)多表查询 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十)多表查询 WhereCascade - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十一)查询返回数据 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十二)Dto 映射查询 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十三)分组、聚合 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十四)Linq To Sql 语法使用介绍 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十五)延时加载 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十六)贪婪加载 Include、IncludeMany - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十八)事务 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (二十九)Lambda 表达式 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十)读写分离 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十一)分表分库 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十二)Aop - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十三)CodeFirst 类型映射 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十四)CodeFirst 迁移说明 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十五)CodeFirst 自定义特性 - 学习文档 - 零一的世界 (vtzw.com)
FreeSql (三十六)进阶 仓储系列文档 - 学习文档 - 零一的世界 (vtzw.com)
发表评论 / 取消回复