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

embedded/2024/10/17 19:40:57/

一、什么是实体间关系

  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.ppmy.cn/embedded/127792.html

相关文章

如何在Android中存储数据?

在Android中存储数据是开发过程中至关重要的一环&#xff0c;根据数据的类型、大小、访问频率及安全性需求&#xff0c;开发者可以选择多种存储方式。以下是Android中存储数据的几种主要方式&#xff0c;每种方式都有其特定的应用场景和优缺点。 一、SharedPreferences Share…

开发实时美颜系统:视频美颜SDK与直播平台的集成方案详解

本文将详细介绍如何开发一个实时美颜系统&#xff0c;并探讨视频美颜SDK与直播平台的集成方案&#xff0c;帮助开发者实现流畅的美颜功能。 一、视频美颜SDK的核心功能 视频美颜SDK主要提供了一系列实时处理视频图像的算法&#xff0c;常见的功能包括&#xff1a; 1.美白、磨…

PolarCTF靶场[web]file、ezphp WP

[WEB]file 知识点&#xff1a;文件上传漏洞 工具&#xff1a;Burp Suite、dirsearch 方法一&#xff1a; 根据页面提示&#xff0c;先用dirsearch工具扫一扫 访问/upload.php&#xff0c;发现一个上传区 在访问/uploaded/,再点击Parent Directory&#xff0c;发现链接到首页…

二叉搜索树(超详细+通俗易懂)

二叉搜索树定义: 二叉搜索树又被称为二叉排序树/二叉搜索树&#xff0c;为什么会被起这样的名字呢&#xff1f;我们先来看一张二叉搜索树的图片 这张图片里面的树就是二叉搜素树&#xff0c;那么二叉树有什么性质呢&#xff1f;我们从图中可以发现&#xff0c;每一个子树都是…

JavaSE——集合2:List(Iterator迭代器、增强for、普通for循环遍历集合)

目录 一、List (一)List接口基本介绍 二、List接口的常用方法 三、List集合的三种遍历方式 四、小练习——使用冒泡排序遍历集合 一、List (一)List接口基本介绍 List接口是Collection接口的子接口 public interface List<E> extends Collection<E> List集…

CMake函数:get_filename_component——从文件路径中提取特定组件

get_filename_component是CMake中的一个命令&#xff0c;用于从文件路径中提取特定组件&#xff08;例如目录、文件名、扩展名等&#xff09;。它的语法如下&#xff1a; get_filename_component(<VAR> <FileName> <COMP> [CACHE])其中&#xff1a; <VA…

Animatediff 工作流之神 Jerry Davos 新作! 使用Differential Diffusion使视频转绘生成稳定的背景。

今天给大家介绍一个新的ComfyUI工作流程&#xff0c;是Animatediff 工作流之神 Jerry Davos 新作。利用 Differential Diffusion 确保视频转绘的时候生成稳定的背景。 它可以使用蒙版对主体和背景进行不同的降噪值降噪&#xff0c;也可以设置它们的控制网为不同的强度。这样&a…

一种用于机械手自适应抓取控制的紧凑型指尖形视触觉传感器

背景 在机器人操作中&#xff0c;手部触觉感知对于稳定抓取起着重要作用。然而&#xff0c;传统的机械手多依赖于固定的抓力预设&#xff0c;无法灵活调整以适应不同类型的物体。尤其在处理脆弱、柔软或不规则物体时&#xff0c;预设的抓力可能导致物体损坏或抓取失败。为此&am…