博客
关于我
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 关系)--学习笔记
阅读量:421 次
发布时间:2019-03-06

本文共 5374 字,大约阅读时间需要 17 分钟。

2.4.4 EF Core -- 关系

  • 一对多
  • 一对一
  • 多对多
  • 示例

关系:

一对多

// Dependent Entity 主表public class Blog{    // Principal Key 标识键/可能是主键或者备用键(唯一性约束)    public int BlogId { get; set; }        public string Url { get; set; }    // Collection navigation property 关联多个从表的属性集合(集合属性)    public List
Posts { get; set; }}// Principal Entity 从表public class Post{ public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // Foreign Key 外键(指向主表中的 Principal Key) // Inverse navigation property 反向导航属性 public int BlogId { get; set; } // Inverse navigation property 反向导航属性 public Blog Blog { get; set; }}

一对一

// Principal Entity 从表public class Blog{    public int BlogId { get; set; }        public string Url { get; set; }    public List
Posts { get; set; }}// Dependent Entity 主表public class Post{ public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // Reference navigation property 一对一时指向另外一张表(引用属性) public Blog Blog { get; set; }}

多对多

public class Post{    public int PostId { get; set; }        public string Title { get; set; }        public string Content { get; set; }    public ICollection
Tags { get; set; }}public class Tag{ public string TagId { get; set; } public ICollection
Posts { get; set; }}

示例

一对多

一个 Project 对应多个 ProjectGroup

在 Project 实体中添加 ProjectGroup 列表

public List
Groups { get; set; }

迁移

dotnet ef migrations add ProjectGroupCollectionProperty

生成集合属性 ProjectGroupCollectionProperty

protected override void Up(MigrationBuilder migrationBuilder){    migrationBuilder.AlterColumn
( name: "ProjectId", table: "ProjectGroups", nullable: true, oldClrType: typeof(string), oldType: "longtext CHARACTER SET utf8mb4", oldNullable: true); migrationBuilder.CreateIndex( name: "IX_ProjectGroups_ProjectId", table: "ProjectGroups", column: "ProjectId"); migrationBuilder.AddForeignKey( name: "FK_ProjectGroups_Projects_ProjectId", table: "ProjectGroups", column: "ProjectId", principalTable: "Projects", principalColumn: "Id", onDelete: ReferentialAction.Restrict);}

手动配置

class MyContext : DbContext{    public DbSet
Blogs { get; set; } public DbSet
Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 先在从表上建立一对一的关系,再从主表上建立一对多的关系 modelBuilder.Entity
() .HasOne(p => p.Blog) .WithMany(b => b.Posts); }}public class Blog{ public int BlogId { get; set; } public string Url { get; set; } public List
Posts { get; set; }}public class Post{ public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; }}

LighterDbContext

// 一对一modelBuilder.Entity
().HasOne
(g => g.Project);// 一对多modelBuilder.Entity
().HasOne
(g => g.Project).WithMany(p => p.Groups);

多对多

为 Project 和 Subject 建立中间表 SubjectProject

public class Project : Entity{    public string Title { get; set; }    public DateTime StartDate { get; set; }    public DateTime EndDate { get; set; }    public string SupervisorId { get; set; }    public string PlanId { get; set; }    public List
Groups { get; set; } public List
SubjectProjects { get; set; }}public class Subject : Entity{ public string Title { get; set; } public string Content { get; set; } public List
SubjectProjects { get; set; }}public class SubjectProject : Entity{ public string ProjcetId { get; set; } public Project Project { get; set; } public string SubjectId { get; set; } public Subject Subject { get; set; }}

配置多对多关系

LighterDbContext

// 多对多(两组一对多)modelBuilder.Entity
() .HasOne
(s => s.Project) .WithMany(p => p.SubjectProjects) .HasForeignKey(s => s.ProjcetId); modelBuilder.Entity
() .HasOne
(s => s.Subject) .WithMany(p => p.SubjectProjects) .HasForeignKey(s => s.SubjectId);

迁移

dotnet ef migrations add SubjectProjectManyToManyRelation

SubjectProjectManyToManyRelation

table.ForeignKey(    name: "FK_SubjectProject_Projects_ProjcetId",    column: x => x.ProjcetId,    principalTable: "Projects",    principalColumn: "Id",    onDelete: ReferentialAction.Restrict);table.ForeignKey(    name: "FK_SubjectProject_Subject_SubjectId",    column: x => x.SubjectId,    principalTable: "Subject",    principalColumn: "Id",    onDelete: ReferentialAction.Restrict);

中间表创建了两个外键,形成多对多

EF Core 5.0 多对多实现

public class Post{    public int PostId { get; set; }    public string Title { get; set; }    public string Content { get; set; }    public ICollection
Tags { get; set; }}public class Tag{ public string TagId { get; set; } public ICollection
Posts { get; set; }}

迁移的时候会自动生成中间表

联接实体类型配置 HasMany

modelBuilder    .Entity
() .HasMany(p => p.Tags) .WithMany(p => p.Posts) .UsingEntity(j => j.ToTable("PostTags"));

GitHub源码链接:

本作品采用进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

你可能感兴趣的文章
Nginx keepalived一主一从高可用,手把手带你一步一步配置!
查看>>
Nginx Location配置总结
查看>>
Nginx log文件写入失败?log文件权限设置问题
查看>>
Nginx Lua install
查看>>
nginx net::ERR_ABORTED 403 (Forbidden)
查看>>
vue中处理过内存泄露处理方法
查看>>
Nginx RTMP 模块使用指南
查看>>
Nginx SSL 性能调优
查看>>
nginx ssl域名配置
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>
Nginx 做负载均衡的几种轮询策略分析
查看>>
Nginx 入门,一篇搞定!
查看>>
Nginx 利用代理转发请求示例
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理+负载均衡
查看>>