ASP.NET Core8.0学习笔记(二十一)——EFCore关系配置API

一、关系配置API概述

  1. 当我们需要指定一个字段作为外键,而这个外键又不符合以上四种约定时,就需要在IEntityTypeConfiguration实现类(对应的配置类)中使用Fluent API直接配置外键。
  2. 理论上可以通过API直接指定一个属性,然后再配置外键。但是由于使用API的情况下导航属性的名称可能无法符合默认约定。而在默认的约定中,除了自动生成外键以外,更重要的是可以通过引用或集合导航属性来指定两个实体之间是一对一还是一对多的关系。因此如要使用API,首先应该明确:
    (1) 使用哪两个实体中的哪两个属性作为导航属性
    (2)两个实体是一对一、一对多还是多对多(较少见)的关系
  3. 在EF Core的Fluent API中,可以通过HasXXX、WithXXX来手动管理实体之间的关系。详细如下

二、一对多关系配置

  1. 应用场景:一个文章对应多条评论(一对多关系)
  2. 两个类:文章实体类Article,评论实体类Comment。一篇文章对应多条评论。评论中的Arcticle对象指向所属文章。 文章就是"主体实体",属关系中的"父级",评论就是"依赖实体",属关系中的"子级"。
    主体实体Article:
csharp 复制代码
```csharp
public class Article
{
    public long Id {get;set;}
    public string Title {get;set;}
    public string Message {get;set;}
    public List<Comment> Comments {get;set;}
}

依赖实体Comment

csharp 复制代码
public class Comment
{
    public long Id {get;set;}
    public Article TargetArticle {get;set;}
    public string Message{get;set;}
}

这两个实体都没有符合默认约定的导航属性,因此必须要通过API进行手动配置。而对于关系的配置一定要体现出实体之间的联系,如一对一还是一对多。这两个实体很明显是一对多的关系。

3.关系配置API

(1)EF Core中实体之间关系配置的套路:

API名称:HasXXX()、WithXXX(),先Has后Many,HasXXX由主体实体指向依赖实体,参数为导航属性,WithXXX()由依赖实体指向主体实体,参数也是导航属性。

所以API的名称有:

一对多:HasOne()、WithMany();

一对一:HasOne()、WithOne();

多对多:HasMany()、WithMany();

注意:在必须先使用Has后使用With。在调用完这两个API后,可以继续调用HasForeignKey()来指定在依赖实体中使用哪一个字段来作为外键。

(2)在有了外键导航属性后,即使在Context中不写其中的一张表,在迁移另一张表时,EF也会根据这个导航将对应的表迁移进去。这个表叫做导航属性表。但是由于DbSet中没有对应字段,会导致无法操作这张表

关系配置可以在两个实体之间任意一端配置。配置时是对于整张表做配置。一般情况下我们将关系配置在"一"端,也可以配置在"多"端。示例代码如下,首先在"多"端,也就是在Comment下进行配置:

示例代码

配置后打开数据库,可以看到对应的外键关系:

接下来在"一"端,也就是在Article一端进行配置(注意执行该操作需要删除数据库重新创建,或者手动移除外键约束以及对应的Migration,也就是回退迁移,并撤回原先的关于外键的代码配置):

执行数据迁移:

三、一对一关系配置

1.先不考虑实际场景,假设文章与评论是一对一的关系,实体如下:

主体实体Article:

csharp 复制代码
```csharp
public class Article
{
     public long Id { get; set; }
     public string Title { get; set; }
     public string Message { get; set; }
     public Comment Comments { get; set; }
}

依赖实体Message:

csharp 复制代码
public class Comment
{
     public long Id { get; set; }
     public string Message { get; set; }; }
	 public int ArticleEntityFkId { get; set; }
	 public Article TargetArticle { get; set; }

}

直接迁移,会发现无法生成外键:

使用API进行配置:将依赖实体的ArticleEntityFkId配置为外键,关系为一对一:

数据迁移:

相关推荐
A153625515 分钟前
国内好用的WMS仓储管理系统有哪些?万里牛WMS深度评测
大数据·数据库·人工智能
SelectDB23 分钟前
快手从 ClickHouse 到 Apache Doris 的百 PB 数据、200+集群迁移实践
数据库·性能优化·开源
衣乌安、31 分钟前
Redis 分布式锁与任务状态
数据库·redis·分布式
踏月的造梦星球1 小时前
DMHS同步原理与DM8到DM8基础搭建
数据库·oracle
Hardworking6662 小时前
第6章 数据工程
运维·服务器·数据库·数据工程
Elastic 中国社区官方博客2 小时前
4 个英伟达人工智能任务,1 个 Elasticsearch 接口:嵌入、聊天、completion 和重排序
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
G.O.G.O.G4 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
其实防守也摸鱼4 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
不能只会打代码4 小时前
Day 002 — Python 工程化 & FastAPI & 数据库速通
数据库·redis·python·docker·fastapi·测试
Rsun045514 小时前
MySQL 中什么是回表?
数据库·mysql