EF Core构建表的三种关系
关系型数据库有三种表关系分别为:一对一, 一对多, 多对多
现在开发模式一般遵循CodeFirst就是通过实体让EF Core生成SQL语句自动帮我们建立数据库以及表关系,具体什么原因自己百度一下哈哈哈哈!
废话不多说我这里直接上三种表类型(一对一, 一对多, 多对多)通过EF Core怎么实现!
1.一对一
表:Husband(老公表) Wife(老婆表)一般情况下夫妻的关系是一对一的 ,特殊情况下除外 嘎嘎嘎!
代码示例:
internal class Husband { public int Id { get; set; } public string HusbandName { get; set; } public Wife Wife { get; set; } }
internal class Wife { public int Id { get; set; } public string WifeName { get; set; } public Husband Husband { get; set; } public int HusbandId { get; set; } }
一对一的话,我们需要相互指向对方 Husband包含 Wife ,同时 Wife也包含Husband 因为在这是一对一所以需要都包含嘛,除此之外我们需要在任意一张表里添加一个外键自动来表示指向的模型,这样一个简单的一对一关系就搞定了
当然你如果不放心,你也可以建一个配置类,手动指明他们的关系,代码如下:
internal class HusbandConfig : IEntityTypeConfiguration<Husband> { public void Configure(EntityTypeBuilder<Husband> builder) { builder.HasOne(x => x.Wife).WithOne(x => x.Husband).HasForeignKey<Wife>(x => x.HusbandId); } }
2.一对多
一对多,我以文章和评论的关系来演示,毕竟一个文章对应多个评论 哈哈哈 ,(废话.JPG)我现在写的文章没有评论!知道真相的我眼泪掉下来!
文章表:Article 评论表:Comment
一对多我们怎么建立外键,一般情况下我们的外键指定在关系为一上,在这里我们就可以外键于Article ,因为在这他的关系是一
代码示例:
一个文章表里有N条评论Article实体中用集合指明即可
internal class Article { public Article() { Comments = new List<Comment>(); } public int Id { get; set; } public string Title { get; set; } public string author { get; set; } ICollection<Comment> Comments{ get; set; } }
外键一般建立在关系为一的主表上,我们直接在Comment 表里添加Article字段即表示外键于主表
internal class Comment { public int Id { get; set; } public string Content { get; set; } public Article Article { get; set; } }
当然你如果不放心,你也可以建一个配置类,手动指明他们的关系,代码如下:
internal class ArticleConfig : IEntityTypeConfiguration<Article> { public void Configure(EntityTypeBuilder<Article> builder) { builder.HasMany(x => x.Comments).WithOne(x => x.Article); } }
2.多对多 以学生与老师举例,一个老师对应N个学生,同理一个学生也对应N个老师!
多对多的关系怎么外键都不合适,无从下手的感觉,所以就要用到第三张表来建立关系。我们先建立Teacher 和Student 看看怎么在EF Core中指定多对多关系吧!
学生表包含多个老师也是用集合字段表示(多对多)
internal class Student { public Student() { Teachers = new List<Teacher>(); } public int Id { get; set; } public string Name { get; set; } public int Sex { get; set; } public ICollection<Teacher> Teachers { get; set; } }
老师表包含多个学生也是用集合字段表示(多对多)
public Teacher() { Students = new List<Student>(); } public int Id { get; set; } public string TeacherName { get; set; } public int Sex { get; set; } public ICollection<Student> Students { get; set; }
如果当前直接执行数据迁移 Add-Migration xxx 并保存到数据库 Update-Database -v(-v表示显示详情信息)的话,EF Core会默认给我们生成一张第三张关系表 名字一般是两张表的名字例(StudentTeacher)
如果要指定生成的第三张表名,我们需要在配置类中指定,代码如下:
internal class StudentConfig : IEntityTypeConfiguration<Student> { public void Configure(EntityTypeBuilder<Student> builder) { builder.HasMany(x => x.Teachers).WithMany(x => x.Students).UsingEntity(x => x.ToTable("Student_Teacher")); } }
这样就可以指定EF Coro在建立第三张关系表生成自己指定的名称了!
这是最近复习基础知识的笔记,如果能帮助到您!真的很开心!
三更灯火五更鸡,正是男儿读书时!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】