EF Core 一对一 一对多 多对多 关系定义
1、定义模型
示例:学生和桌子的一对一关系:每个学生需要对应一个桌位信息,桌位信息不用包含学生信息
public class Desk { public int Id { get; set; } public string Name { get; set; } public Student Student { get; set; } }
public class Student { public int Id { get; set; } public string Name { get; set; } public int DeskID { get; set; } public Desk Desk { get; set; } }
在Student中定义 DeskID和Desk模型,在Desk表中定义Student模型
2、在DataContext中定义两者的关系
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Do:一对一关系模型 modelBuilder.Entity<Student>().HasOne(l => l.Desk).WithOne(l => l.Student) .HasForeignKey<Student>(l => l.DeskID); }
public DbSet<Student> Students { get; set; }
public DbSet<Desk> Desks { get; set; }
此时通过迁移命令将会生成Students表和Desks表
1、定义模型
示例:学校和老师的一对多关系:一个学校对应多个老师,一个老师对应一个学校
public class School { public int Id { get; set; } public string Name { get; set; } public List<Teacher> Teachers { get; set; } }
public class Teacher { public int Id { get; set; } public string Name { get; set; } public int SchoolID { get; set; } public School School { get; set; } }
2、在DataContext中定义两者的关系
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Do:一对多关系模型 modelBuilder.Entity<Teacher>().HasOne(l => l.School).WithMany(l => l.Teachers) .HasForeignKey(l => l.SchoolID); } public DbSet<Teacher> Teachers { get; set; } public DbSet<School> Schools { get; set; }
此时通过迁移命令将会生成Schools表和Teachers表
五、多对多的关系模型
1、定义模型:
示例:建立父母和孩子的多对多模型,父母可以对应多个孩子,孩子可以有父亲,母亲的对应关系
// Do:定义父母类型 public class Parent { public Parent() { this.RelationShips =new List<RelationShip>(); } public int Id { get; set; } public string Name { get; set; } // Do:3、定义关系集合 public List<RelationShip> RelationShips { get; set; } }
// Do:定义子类型 public class Child { public Child() { this.RelationShips=new List<RelationShip>(); } public int Id { get; set; } public string Name { get; set; } // Do:2、定义关系集合 public List<RelationShip> RelationShips { get; set; } }
/// <summary> /// 1、多对多关系模型 /// </summary> public class RelationShip { public int ChildID { get; set; } public Child Child { get; set; } public int ParentID { get; set; } public Parent Parent { get; set; } }
2、在DataContext中定义两者的关系
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Do:多对多配置联合主键 modelBuilder.Entity<RelationShip>().HasKey(l => new {l.ChildID, l.ParentID}); // Do:多对多定义关系模型映射(本段代码可有可无) modelBuilder.Entity<RelationShip>().HasOne(l => l.Child).WithMany(l => l.RelationShips) .HasForeignKey(l => l.ChildID); modelBuilder.Entity<RelationShip>().HasOne(l => l.Parent).WithMany(l => l.RelationShips) .HasForeignKey(l => l.ParentID); } public DbSet<Teacher> Teachers { get; set; } public DbSet<School> Schools { get; set; }
分类:
.NET- EF Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2019-03-04 一个C#程序员学习微信小程序的笔记