博客
关于我
.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) 。

你可能感兴趣的文章
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>