ASP.NET Core8.0学习笔记(二十)——EFCore导航属性与外键

news2025/1/19 14:35:36

一、什么是实体间关系

  1. 数据库表(实体)之间的关系:一对一(学生-成绩)、一对多(学生-科目)、多对多(教师-班级)。数据库中,每一个实体可以由主键唯一标识,而每一条“关系”则由外键进行标识。
    (1) 外键分为逻辑外键与物理外键。逻辑外键在数据库中不存在任何体现与约束,所有约束由业务代码进行控制,方便管理与迁移;物理外键在数据库中直接表现为外键列,需要严格按照数据库约束进行增删操作。
  2. EF Core不仅支持单实体操作,更支持多实体之间的关系操作。通过关系操作实体主要由两大途径:一是通过逻辑/物理外键手动编写关联查询;二就是通过导航属性进行操作。
  3. 操作步骤三部曲:实体类中的关系属性;FluentAPI关系配置;使用关系操作
  4. 一些有关术语:
    (1)依赖实体:包含外键属性的实体,有时指的是关系的子级。
    (2)主体实体:包含主键/备选键属性的实体,有时是指的关系的“父级”
    (3)主体键:唯一标识主体实体的属性或属性集合,它可能是主键,也有可能是备选键
    (4)外键:依赖实体中用于存储主体实体的主键值属性
    (5)导航属性:在引用相关实体的主体实体和/或依赖实体上定义的属性。
    ①集合导航属性:包含对多个依赖实体引用的导航属性
    ②引用导航属性:对单个依赖实体引用的导航属性
    ③反向导航属性:对于特定导航属性关系上一端的导航属性与另一端的导航属性互为反向导航属性。
    (例如A中的导航属性b指向实体B,而B中又有属性a指向实体A,则a与b互为反向导航属性)

二、默认的外键约定与导航属性

  1. 导航属性:在EntityFramework中实体之间的关系由“导航属性(Navgation Properity)”来定义与体现。注意,导航属性将无法映射为数据库中的单个字段(原子属性),只能映射为外键关系。
  2. 默认外键约定:
    在EF Core中,约定大于配置,在以下情况下会默认生成外键(依赖实体的导航属性就将会被映射外键)
    已知主体实体Blog与依赖实体Post
    在这里插入图片描述

3.第一种情况:引用导航属性,导航属性名+主体主键名:此时主体实体与依赖实体构成一对一关系
主体实体:


```csharp
 public class Blog
 {
     public int Id { get; set; }
     public string Title { get; set; }    
     public string Content{ get; set; }
     //导航属性名
     public Post Post { get; set; }
 }

依赖实体:

public class Post
{
    public int Id { get; set; }
    public string? Title { get; set; }
    public string? Content { get; set; }
    public string? AuthorName { get; set; }
    public DateTime? UpdateTime { get; set; }
    //主体主键名
    public int BlogId { get; set; }
}

在主体实体Blog中,属性Post充当了依赖实体的导航属性,每一个Blog对象都拥有一个对应的Post对象。此时对应Post对象中的BlogId指向了Post所属的Blog对象,二者构成一对一关系,生成对应的外键。执行数据迁移进行测试:
在这里插入图片描述

可以看到此时已经生成了对应的外键。
4.第二种情况,集合导航属性,集合导航属性名+主体主键名:此时构成一对多关系,一个主体实体通过List集合来含有多个依赖实体。
主体实体:


```csharp
 public class Blog
 {
     public int Id { get; set; }
     public string Name { get; set; }
     //导航属性集合 一对多 一个Blog含有多个Post
    public List<Post> Posts { get; set; }
 }

依赖实体:


```csharp
public class Post
{
    public int Id { get; set; }
    //主体主键名 每一个Post都需要对应唯一一个Blog
    public int BlogId { get; set; }
    public string? Content { get; set; }
    public DateTime? UpdateTime { get; set; }
}

迁移代码:
在这里插入图片描述

需要注意的是,此处作为导航属性的List不能使用new进行初始化,进行初始化后就不能作为导航属性来使用了。
5.第三种情况:主体属性名+(主体属性+主体主键名)。此时构成一对一关系
主体实体:

 public class Blog
 {
     public int Id { get; set; }
     public string Title{ get; set; }
public string? Content{ get; set; }
 }

依赖实体:


```csharp
public class Post
{
    public int Id { get; set; }
    public string? Content { get; set; }
    public DateTime? UpdateTime { get; set; }
    //主体属性+主体主键名
    public int BlogId { get; set; }
    //主体名
    public Blog? Blog { get; set; } 
}

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

成功生成外键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学1个月拿金奖!北交大学子分享昇腾AI原生创新算子挑战赛金奖之路

近年来在人工智能领域&#xff0c;算子开发的价值日益凸显&#xff0c;算子开发也受到越来越多年轻开发者的青睐。对于高校开发者&#xff0c;如何从零开始学习算子开发&#xff0c;提升软硬结合的AI开发能力&#xff1f;成功已举办两个赛季的昇腾AI原生创新算子挑战赛&#xf…

IDEA中的快捷键大全--超详细

目录 一、通用类型 1.1 图示 1.2 表格化 二、编写速度提升 2.1 图示 2.1.1 表格化 2.2 图示 2.2.1 表格化: 三、类结构,查找和查看源码 3.1 图示 3.2 表格化 四、查找,替换和关闭 4.1图示 4.2 表格化 五、调整格式 5.1 图示 5.2 表格化 六、快捷键的自主定义…

docker login 命令登录harbor镜像仓库(含报错)

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/02/02 14:10 执行登录命令&#xff1a;docker login -uadmin 192.168.43.106:8880 报错&#xff1a; Error response from daemon: Get "https://192.168.43.106:8880/v2/": http: server gave HTTP response t…

计组-CPU构成(运算器与控制器的组成)

整个计算机&#xff0c;由主机和外设2部分构成 计算机结构中&#xff1a; 主机&#xff08;这里的主机包含的部分远比我们主机箱里的部件要少&#xff09;&#xff1a;只包括2大部件&#xff0c;一个是CPU&#xff0c;一个是主存储器&#xff08;即我们平时说的内存&#xff…

专题1:方向导数与梯度

一、回忆偏导数 多元函数&#xff08;比如有x、y两个变量&#xff09;在某个点有两个偏导数&#xff0c;一个是关于x的偏导数&#xff0c;一个是关于y的偏导数。如下所示&#xff1a; 所谓偏导数&#xff0c;其实就是某点处函数在x的正方向或y的正方向上的变化率。从图像上来看…

JavaSE--全盘拿下数组的关键要领

嗨嗨大家~我来啦&#xff01;今天我们来进入数组的学习吧。 目录 一 数组的定义 1 创建数组 2 初始化数组 二 数组的使用 1 数组的访问 2 数组的遍历 2.1 for 循环打印 2.2 for-each 打印数组 三 数组是引用类型 3.1 JVM内存分布 3.2 区分基本类型与引用类型变…

线程相关知识点

一、线程 1.1 线程的概念 线程是轻量级的进程。 进程是分配资源的最小单位&#xff0c;线程是调度的最小单位。 线程不会单独分配内存空间&#xff0c;线程共用进程的资源。 线程之间通信比较方便&#xff0c;但是不安全。 多线程没有多进程安全。 多线程效率比较高。线程创建…

嵌入式学习-I/O-Day01

嵌入式学习-I/O-Day01 IO介绍 IO分类 文件IO 标准IO 标准IO的调用逻辑 标准IO缓存机制 标准IO的特点 * 流 定义 流的分类 流指针FILE * 缓存区的分类 * 全缓存—》基于文件 行缓存-》基于终端stdin/stdout 不缓存&#xff1a;stderr 标准IO的函数接口 ​​​​…

小白都来用这款AI绘画神器,IDEOGRAM2.0,轻松画出高质量图片

大家好&#xff01;我是宇航&#xff0c;一位喜欢AI绘画的10年技术专家&#xff0c;专注于输出AI绘画与视频内容 今天给大家介绍一款绝对的生图神器——Ideogram2.0! 不论你是AI小白&#xff0c;手残党还是资深玩家&#xff0c;无论你是做网页设计&#xff0c;电商&#xff0c…

React路由 基本使用 嵌套路由 动态路由 获取路由参数 异步路由 根据配置文件来生成路由

文章目录 React-router的三个版本react-router使用嵌套路由动态路由 获取路由参数Params参数Query参数Location信息 控制跳转地址异步路由根据配置文件生成路由 React-router的三个版本 React-router 服务端渲染使用React-router-dom 浏览器端渲染使用React-router-native Rea…

【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号

目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks&#xff0c;时钟树上所有总线频率均设置为了STM32F0能达到的最高频率&#xff0c;此时APB1 Timer clocks …

【CTF Web】Pikachu ../../ Writeup(路径遍历)

目录遍历漏洞概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值(比如文件名称)传递到后台&#xff0c;后台再执行其对应的文件。 在这个过程中&a…

Diffusion model原理:李宏毅篇(1)

本文是对李宏毅老师相关视频的记录。视频连接:Diffusion Model数学原理(一) 1. 基本概念 slide注释有一个加噪的扩散过程和一个去噪生成图像的过程VAE与Diffusion model有类似的地方。Diffusion model加噪的过程可以看成是VAE的encoder,去噪的过程看成是VAE的decoder2. DD…

【Linux】信号(初版)

信号概念 信号是进程之间发送异步信息的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是一个发送信号的行为。我们按下ctrl c是在shell进程中&#xff0c;而被终止的进程&#xff0c;是在前台运行的另外一个进程。…

[2024领航杯] Pwn方向题解 babyheap

[2024领航杯] Pwn方向题解 babyheap 前言&#xff1a; 当然这个比赛我没有参加&#xff0c;是江苏省的一个比赛&#xff0c;附件是XiDP师傅在比赛结束之后发给我的&#xff0c;最近事情有点多&#xff0c;当时搁置了一天&#xff0c;昨天下午想起来这个事情&#xff0c;才开始…

C++容器适配器1-基本使用(stack、queue)

###适配器意思是可以将一种不能用于某种场景的东西经过特殊转换&#xff0c;包装成一个新东西&#xff0c;这个新定西可以用于这个场景&#xff0c;并且还具有之前旧东西的功能作用&#xff1b; stack、queue就是C里面的容器适配器&#xff0c;这两个适配器堆vector和list两个…

前端进阶之路:推荐几本不可错过的前端开发书籍

前端开发是一个不断更新换代的领域&#xff0c;作为一名前端工程师&#xff0c;持续学习和提升自己是至关重要的。阅读专业书籍是系统学习前端知识的一种有效方式。以下是一些前端开发者不可错过的书籍推荐&#xff0c;帮助你巩固基础&#xff0c;拓宽视野&#xff0c;成为更优…

【进阶OpenCV】 (13)--视频物体跟踪

文章目录 物体跟踪一、跟踪器二、代码实现1. 创建CSRT跟踪器实例2. 打开视频文件3. 主循环3.1 读取每一帧3.2 设置跟踪目标3.3 更新跟踪器&#xff0c;获取对象位置3.4 显示视频每一帧 4. 释放资源和关闭窗口5. 完整代码展示 总结 物体跟踪 本篇我们来介绍&#xff0c;如何对移…

Nvidia Jetson Orin平台部署CenterPoint模型

最近尝试将CenterPoint模型部署到Orin平台,网络上教程很多,也很杂乱,于是便整理一版自用。 主要根据NVIDIA Lidar AI Solution进行复现。并在此基础上进行补充 Orin平台: python:3.8 CUDA:11.4 torch:1.14.0 torchvision:0.15.1 TensorRT: 8.5.2.1 在Compile &&a…

第十九篇——复盘:数学给了我什么启示?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学带给这个世界什么&#xff1f;数学在我们的人生路上意味着什么&#…