导航属性是 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种关系。

系列文章导航

最新文章

  1. Python模拟入栈出栈操作
  2. jquery each循环,
  3. 特征提取k_word
  4. ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)
  5. APP定制开发:APP软件开发的语言和开发环境
  6. 高斯混合聚类及EM实现
  7. 自己模拟实现spring IOC原理
  8. PyQt 学习笔记1——自定义窗口框架
  9. opencv_协方差矩阵与协方差讲解
  10. storm入门教程 第一章 前言[转]
  11. Qt标题栏图标和运行程序图标设置
  12. ACM第二次比赛( C )
  13. 一个好用的Dialog插件
  14. leetcode第一题--two sum
  15. Java学习笔记-嵌套类
  16. Java开发笔记(七十五)异常的处理:扔出与捕捉
  17. Matlab R2015b_@Ubuntu 16_安装备忘
  18. kali linux 更新问题
  19. 尚硅谷redis学习8-事务
  20. ora-12899解决方法

热门文章

  1. H5 Handlebars的简单使用
  2. 最新 Flutter 团队工程师中文演讲 | Flutter 的性能测试和理论
  3. 100天搞定机器学习|Day17-18 神奇的逻辑回归
  4. Salesforce LWC学习(四) 父子component交互 / component声明周期管理 / 事件处理
  5. opencv3 编程入门学习笔记(一): 基本函数介绍
  6. js-EventLoop
  7. django 获取当前访问的URL
  8. C#_细说Cookie_Json Helper_Cookies封装
  9. SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
  10. python相关性算法解决方案(rest/数据库/json/下载)