導航屬性是 FreeSql 的特色功能之一,可通過約定配置、或自定義配置對象間的關系。
導航屬性有 OneToMany, ManyToOne, ManyToMany, OneToOne, Parent 五種配置關系。
有了導航屬性,多表查詢會非常方便,lambda 表達式中直接使用導航對象點點點,舒服!!
除了查詢還有更多其他的特性在后續文章中再介紹。
自定義導航關系
//導航屬性,OneToMany
[Navigate("song_id")]
public virtual List<song_tag> Obj_song_tag { get; set; }//導航屬性,ManyToOne/OneToOne
[Navigate("song_id")]
public virtual Song Obj_song { get; set; }//導航屬性,ManyToMany
[Navigate(ManyToMany = typeof(tag_song))]
public virtual List<tag> tags { get; set; }
- 可約定,可不約定;
- 不約定的,需指定 Navigate 特性關聯;
- 無關聯的,查詢時可以指明 On 條件,LeftJoin(a => a.Parent.Id == a.ParentId);
- 已關聯的,直接使用導航對象就行,On 條件會自動附上;
也可以使用 FluentApi 在外部設置導航關系:
fsql.CodeFirst.ConfigEntity<實體類>(a => a.Navigate(b => b.roles, null, typeof(多對多中間實體類)).Navigate(b => b.users, "uid")
);
優先級,特性 > FluentApi
約定配置
OneToOne 一對一
class User {public int Id { get; set; } //Id、UserId、User_idpublic UserExt UserExt { get; set; }
}class UserExt {public int id { get; set; } //Id、UserId、User_id、UserExtId、UserExt_idpublic 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_idpublic 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_idpublic ICollection<User> AUsers { get; set; }public ICollection<User> BUsers { get; set; }
}class User {public int Id { get; set; } //Id、UserId、User_idpublic 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_idpublic int ParentId { get; set; } //ParentId、Parent_idpublic 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種關系。
系列文章導航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數據
(六)批量插入數據
(七)插入數據時忽略列
(八)插入數據時指定列
(九)刪除數據
(十)更新數據
(十一)更新數據 Where
(十二)更新數據時指定列
(十三)更新數據時忽略列
(十四)批量更新數據
(十五)查詢數據
(十六)分頁查詢
(十七)聯表查詢
(十八)導航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數據
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性