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

一、什么是实体间关系

  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.第一种情况:引用导航属性,导航属性名+主体主键名:此时主体实体与依赖实体构成一对一关系
主体实体:


```csharppublic 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集合来含有多个依赖实体。
主体实体:


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

依赖实体:


```csharp
public class Post
{public int Id { get; set; }//主体主键名 每一个Post都需要对应唯一一个Blogpublic 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.mzph.cn/diannao/56623.shtml

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

相关文章

MySQL表的基本查询下/分组聚合统计

1&#xff0c;update 对查询到的结果进行列值更新&#xff0c;可以和older by&#xff0c;where&#xff0c;limit合并使用&#xff0c;为了方便讲解&#xff0c;将会以题目练习的方式进行说明&#xff1a; 1&#xff0c;将孙悟空同学的数学成绩变更为 80 分 本道题和where联…

动态规划(1)斐波那契数列模型

动态规划算法流程&#xff1a; 1、状态表示&#xff1a; 指的是dp&#xff08;dynamic programming&#xff09;表里面的值所表示的含义 如何得出&#xff1a;1、题目要求 2、经验题目要求 3、分析问题的过程中发现重复子问题 2、状态转移方程 dp[i]等于什么 3、初始化 保证…

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…

案例实践 | 以长安链为坚实底层,江海链助力南通民政打造慈善应用标杆

案例名称-江海链 ■ 实施单位 中国移动通信集团江苏有限公司南通分公司、中国移动通信集团江苏有限公司 ■ 业主单位 江苏省南通市民政局 ■ 上线时间 2023年12月 ■ 用户群体 南通市民政局、南通慈善总会等慈善组织及全市民众 ■ 用户规模 全市近30家慈善组织&#…

leetcode二叉树(八)-二叉树的最大深度

题目 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&…

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波 前言MPU6050寄存器代码详解mpu6050.cmpu6050.h 使用说明 前言 本篇文章基于卡尔曼滤波的原理详解与公式推导&#xff0c;来详细的解释下如何使用卡尔曼滤波来解算MPU6050的姿态 参考资料&#xff1a;Github_mpu6050 MPU6050寄存器…

项目管理软件真的能让敏捷开发变得更简单吗?

敏捷开发是一种以快速交付和适应变化为核心特点的软件开发方法。其特点包括尽早并持续交付、能够驾驭需求变化、版本周期内尽量不加任务、业务与开发协同工作、以人为核心、团队配置敏捷等。 例如&#xff0c;尽早并持续交付可使用的软件&#xff0c;使客户能够更早地体验产品…

【算法篇】动态规划类(4)——子序列(笔记)

目录 一、Leetcode 题目 1. 最长递增子序列 2. 最长连续递增序列 3. 最长重复子数组 4. 最长公共子序列 5. 不相交的线 6. 最大子序和 7. 判断子序列 8. 不同的子序列 9. 两个字符串的删除操作 10. 编辑距离 11. 回文子串 12. 最长回文子序列 二、动态规划总结 …

[Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器

目录 一. IP协议头格式 学习任何协议前的两个关键问题 IP 报头与有效载荷分离 分离方法 为什么需要16位总长度 如何交付 二. 网络通信 1.IP地址的划分理念 2. 子网管理 3.网络划分 CIDR&#xff08;无类别域间路由&#xff09; 目的IP & 当前路由器的子网掩码 …

外包干了3周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了3周的功…

神经网络构建与训练深度学习模型全过程(PyTorch TensorFlow)

神经网络构建与训练深度学习模型全过程&#xff08;PyTorch & TensorFlow&#xff09; 目录 &#x1f517; 什么是神经网络&#xff1a;基础架构与工作原理&#x1f9e9; 构建简单的神经网络&#xff1a;层次结构与激活函数&#x1f680; 前向传播&#xff1a;神经网络的…

基于Handsontable.js + Excel.js实现表格预览和导出功能(公式渲染)

本文记录在html中基于Handsontable.js Excel.js实现表格预览、导出、带公式单元格渲染功能&#xff0c;在这里我们在html中实现&#xff0c;当然也可以在vue、react等框架中使用npm下载导入依赖文件。 Handsontable官方文档 一、开发前的准备引入相关依赖库 <!DOCTYPE ht…

微服务经典应用架构图

从网上找了一个经典的微服务架构图&#xff0c;资料来源于若依开源系统的ruoyi-cloud&#xff0c;仅供参考&#xff01;

面向城市运行“一网统管”的实景三维示范应用

在新型智慧城市建设的浪潮中&#xff0c;实景三维技术正成为推动城市治理现代化的重要力量。“一网统管”作为城市运行管理的新理念&#xff0c;强调了跨部门协作和数据共享&#xff0c;而实景三维技术为此提供了强有力的支撑。本文将探讨实景三维技术如何赋能“一网统管”&…

Linux笔记---vim的使用

1. vim的基本概念 Vim是一款功能强大的文本编辑器&#xff0c;它起源于Unix系统的vi编辑器&#xff0c;并在其基础上进行了许多改进和增强。 Vim以其高效的键盘操作、高度的可定制性和强大的文本处理能力而闻名&#xff0c;尤其受程序员和系统管理员的欢迎。 Vim支持多种模式…

cmake 编译 01

CMakeLists.txt cmake_minimum_required(VERSION 3.10)project(MyProject)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)# 如果顶层 CMakeLists.txt 文件中使用了 add_subdirectory() 命令&#xff0c;CMake 会进入指定的子目录&#xff0c;并处理该目录…

2024年超好用的防泄密软件分享|10款加密防泄密软件推荐

在当今数字化时代&#xff0c;企业数据安全已成为不可忽视的重要议题。随着数据泄露事件频发&#xff0c;选择一款高效可靠的防泄密软件变得尤为重要。本文将为您推荐10款在2024年备受推崇的防泄密软件&#xff0c;并重点介绍Ping32防泄密软件的功能与优势。 1. Ping32防泄密软…

Zico 2 靶机 - 详细流程

✨ 准备工作 靶机 && kali 环境要求 机器名网络配置靶机Zico 2NAT 模式攻击机kaliNAT 模式 靶机下载链接&#xff1a;zico2: 1 ~ VulnHub 打开 VMware&#xff0c;将 zico2.ova 拖拽到 VMware 中 设置 虚拟机名称(A) - 存储路径(P)- 导入 若是&#xff0c;…

3. 单例模式唯一性问题—构造函数

1. 构造函数带来的唯一性问题指什么&#xff1f; 对于不继承MonoBehaviour的单例模式基类 我们要避免在外部 new 单例模式类对象 例如 &#xff08;完整单例模式定义在上一节&#xff09; public class Main : MonoBehaviour {void Start(){// 破坏单例模式的唯一性&#xf…