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

ops/2024/10/15 19:29:06/

一、关系配置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/ops/126078.html

相关文章

GC 算法

垃圾回收主要在&#xff1a;堆区和方法区 # 标记阶段&#xff1a;引用计数算法 在堆里存放着几乎所有的 Java 对象实例&#xff0c;在 GC 执行垃圾回收之前&#xff0c;首先需要区分出内存中哪些是存活对象&#xff0c;哪些是已经死亡的对象。只有被标记为已经死亡的对象&…

专题:贪心算法(已完结)

1.分发饼干 方法一&#xff1a;用最大的胃口 找到最大的饼干&#xff08;先遍历胃口&#xff09; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 主要思路 用最大的饼干找最大的胃口sort(g.begin(),g.end());so…

YoloDotNet 在工业检测中的应用详解

文章目录 一、数据收集与标注二、模型选择与训练三、检测流程设计四、结果评估与优化五、与工业生产线集成一、数据收集与标注 在工业检测中,首先需要收集大量的相关工业产品图像数据。这些数据应涵盖不同的产品类型、缺陷种类以及各种可能的生产状态。例如,对于电子产品的检…

MySQL安装与配置详细教程

MySQL 是一个广泛使用的开源数据库管理系统&#xff0c;适用于各类应用程序。本文将详细介绍如何在 Linux&#xff08;如 Ubuntu&#xff09;、Windows 系统上安装和配置 MySQL&#xff0c;以帮助你快速搭建起一个稳定的数据库环境。 一、在 Ubuntu 系统上安装 MySQL 1. 更新…

国产人工智能教学实验箱操作案例分享:5-27 指纹识别实验

一、实验目的 熟悉Qt程序的开发流程。 掌握Qt Creator的基础开发使用。 通过编写Qt程序实现指纹识别的显示界面。 二、实验原理 Qt工程的创建步骤包括&#xff1a; &#xff08;1&#xff09;创建Qt工程&#xff1b; &#xff08;2&#xff09;GUI的设计实现&#xff1a;LCD…

出海快报 | “三消+短剧”手游横空出世,黄油相机“出圈”日本市场,从Q1看日本手游市场趋势和机会

编者按&#xff1a;TopOn出海快报栏目为互联网出海从业者梳理出海热点&#xff0c;供大家了解行业最新发展态势。 1.“三消短剧”横空出世&#xff0c;融合创新手游表现亮眼 随着竞争的加剧&#xff0c;新产品想要突出重围&#xff0c;只能在游戏中加入额外的元素。第一次打开…

萱仔求职复习系列——2 Linux的常用方法(包含基础进阶高级操作)

由于最近接了一个笔试&#xff0c;发现笔试可能涉及到Linux&#xff0c;我准备临时抱佛脚一下赶紧复习一下Linux的用法哈哈。Linux 的基础用法包含文件系统操作、权限管理、网络配置、进程管理等基本命令&#xff1b;进阶操作包括网络调试、包管理、服务管理和用户管理等&#…

低成本轻量化5G网络部署redcap技术

RedCap&#xff08;Reduced Capability&#xff09;轻量化5G路由器旨在提供低功耗、成本效益高、性能较5G完整版稍微降低的解决方案。用于满足工业物联网&#xff08;IoT&#xff09;、消费电子产品和轻量级5G设备的需求。通过对5G技术进行一定程度的“功能裁剪”&#xff0c;降…