类别:学习文档

日期:2021-07-15 浏览:2156 评论: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; }
}

《OneToOne 一对一,怎么添加数据?》

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; }
}

《OneToMany 一对多,怎么添加数据?》

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)


本文标题:FreeSql (十八)导航属性
本文链接:https://vtzw.com/post/716.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一的世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
 您阅读本篇文章共花了: 

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。