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

server/2024/10/23 2:35:36/

一、关系配置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
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

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
public class Article
{public long Id { get; set; }public string Title { get; set; }public string Message { get; set; }public Comment Comments { get; set; }
}

依赖实体Message:

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配置为外键,关系为一对一:
在这里插入图片描述

数据迁移:
在这里插入图片描述


http://www.ppmy.cn/server/134050.html

相关文章

nginx反向代理下的长连接

一、nginx使用场景 大型应用架构中&#xff0c;一般会使用nginx反向代理&#xff0c;分为三层&#xff1a; 1.调用层&#xff0c;浏览器或APP&#xff1b; 2.中间层&#xff0c;反向代理nginx&#xff1b; 3.服务层&#xff0c;server一般是apche、tomcat 请求调用过程&…

算法的学习笔记—(牛客JZ50)

&#x1f600;前言 在处理字符串时&#xff0c;寻找第一个只出现一次的字符是一项常见的任务。本文将探讨几种有效的解法&#xff0c;包括使用 HashMap 和位集&#xff08;BitSet&#xff09;。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;第一个只出现…

来个Oracle一键检查

启停、切换、升级、网络改造等场景下&#xff0c;需要对数据库有些基本检查操作&#xff0c;确认当前是否运行正常&#xff0c;主打一个简单和一键搞定。 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## linux vmstat 2 …

截止10月19日,复盘秋招23场面试(三)每一场面试的核心问题和内容

1OPPO提前批一面 这份文件是一次面试的转写记录&#xff0c;面试的参与者是求职者面试者和OPPO的面试官。以下是面试的核心内容&#xff1a; 面试开始&#xff1a; 面试官和求职者进行了简单的问候&#xff0c;并确认了可以听到对方的声音。 自我介绍&#xff1a; 面试者介绍…

算法的学习笔记—数组中的逆序对(牛客JZ51)

&#x1f600;前言 在算法和数据结构领域&#xff0c;"逆序对"是一个经典问题。它在数组中两个数字之间定义&#xff0c;若前面的数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。我们要做的就是&#xff0c;给定一个数组&#xff0c;找出数组中所有的逆…

Vue的响应式原理

Vue.js 是一个流行的前端框架&#xff0c;它的响应式系统是其核心特性之一&#xff0c;能够有效地处理数据变化并自动更新视图。在这篇文章中&#xff0c;我们将探讨 Vue 的响应式原理&#xff0c;包括其实现方式、关键概念以及性能优化。 1. 响应式原理概述 Vue 的响应式原理…

vue3 解决背景图与窗口留有间隙的问题

需要实现一个登录界面&#xff0c;login.vue的代码如下&#xff1a; <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…

软考(网工)——局域网和城域网

文章目录 &#x1f550;局域网基础1️⃣局域网和城域网体系架构 IEEE&#xff08;负责链路层&#xff09;2️⃣局域网拓扑结构 &#x1f551;CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 &#x1f552;二进制指数退避算法1️⃣ 二进制指数退避算法 &#x1…