Entity Framework Core 简明教程(3)- 关系处理

news2024/11/27 8:43:50

在数据库层面,表之间关系,通过主键、外键来实现,基于约束 (constraint) 和数据完整性来制约。 在 EF Core 技术层面,并不是简单地与数据库这些关系和约束对应,EF Core 有它自己的机制。本篇介绍 EF core 在处理表关系方面的典型技术点。为了理解的方便,示例数据库只包含两个表:Articles (文章)和 Comments (文章评论)。很明显,Articles 和 Comments 是一对多关系(一篇文章存在多条评论论)。在数据库中,Comments 表的 Id 字段是外键,指向 Articles 表的 主键 Id 字段。一对多关系是数据表最重要的关系。

数据库中的关系

请添加图片描述

请添加图片描述

对象模型中的关系

在 EF Core 中,我们在实体类中定义模型的关系,一般通过导航属性来实现。比如刚才的表模型,在 Articles 实体中, Comments 属性是一个 List,表达 Article 含有多条 Comment。

请添加图片描述
当然,这只是 EF Core 提供的的一种实现方式,也可以在 Comments 实体中定义导航属性,指向 Articles 实体。在两个类中同时定义也是可以的。

请添加图片描述

注意,这里并不需要显示定义 ArticleId 字段来标识 Comments 表的外键。

EF Core 关系映射

EF Core 中关系映射,最基本的内容包括:

  • 为每一个实体 (entity) 添加主键
  • 为实体添加外键 (如果有的话)
  • 通过主键外键定义两个实体的参照关系 (能够清晰地体现出一对多)

请添加图片描述
(示例为在多的一方定义)

关系表的增删改查

刚才的示例中,在 Articles 实体中和 Comments 实体中,都定义了导航属性。这样我们可以很方便的进行 Create 操作。示例方式一:利用 Articles 实体的导航属性:

[TestMethod]
public void TestInsert1()
{
    var a1 = new Article 
    { 
        Title = ".net下主要ORM框架",
        Content = "xxxxx"
    };

    a1.Comments.Add(new Comment { CommentContent = "非常赞"});
    a1.Comments.Add(new Comment { CommentContent = "强烈支持"});

    using var context = new AppDbContext();
    context.Articles.Add(a1);
    context.SaveChanges();
}

注意到:不需要显式为 Comment 实体的 Article 属性赋值

示例新增方式二:利用 Comment 实体的导航属性:

[TestMethod]
public void TestInsert2()
{
    var a1 = new Article
    {
        Title = "EFCore 从入门到精通",
        Content = "EFCore"
    };

    var c1 = new Comment { 
        CommentContent = "这篇文章真不错",
        Article = a1
    };

    var c2 = new Comment
    {
        CommentContent = "这篇文章写的不错呀",
        Article = a1
    };

    a1.Comments.Add(c1);
    a1.Comments.Add(c2);

    using var context = new AppDbContext();
    context.Articles.Add(a1);
    context.SaveChanges();
}

假设我们想对已有的 Article 进行新增操作,我们也能利用导航属性来实现,举例如下:

[TestMethod]
public void TestAddComments()
{
    using var context = new AppDbContext();

    var article = context.Articles.Single(a => a.Id == 20);
    article.Comments.Add(new Comment {CommentContent = "我觉得文章不怎么样" });

    context.SaveChanges();
}

查询中获取表关系

刚才我们看到,Article 表和 Comment 表已经定义了主键和外键,在模型层面,定义了导航属性,并且定义了关系。此时我们试着查询出 Id == 20 的文章以及文章相应的 comment,我们先尝试下面的代码:

[TestMethod]
public void TestQueryArticles()
{
    using var context = new AppDbContext();

    var article = context.Articles.Single(a=>a.Id==20);
    Console.WriteLine(article.ToString());
    article.Comments.ForEach(Console.WriteLine);
}

我们发现,并没有关联到 comments 实体:

请添加图片描述

如果在查询的时候,需要关联数据,需要利用 Microsoft.EntityFrameworkCore 的扩展方法 Include() 方法:

[TestMethod]
public void TestQueryArticleAndComments()
{
    using var context = new AppDbContext();
    var article = context.Articles.Include(a=>a.Comments).Single(a=>a.Id==20);

    // print article and related comments
    Console.WriteLine(article.ToString());
    article.Comments.ForEach(Console.WriteLine);
}

运行的测试结果如下,能够获取到 article 的 comments:

请添加图片描述

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

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

相关文章

HTML+CSS实训——Day03——仿网易云音乐的发现页界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 一些今天需要用到的知识点 弹性盒子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedg…

二次元的登录界面

今天还是继续坚持写博客&#xff0c;然后今天给大家带来比较具有二次元风格的登录界面&#xff0c;也只是用html和css来写的&#xff0c;大家可以来看看&#xff01; 个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &…

[acwing周赛复盘] 第 105 场周赛20230527

[acwing周赛复盘] 第 105 场周赛20230527 总结5029. 极值数量1. 题目描述2. 思路分析3. 代码实现 5030. 核心元素1. 题目描述2. 思路分析3. 代码实现 5031. 矩阵扩张1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是笨比的一周&#xff0c;只做出1题。T1 模拟T2 计…

leetcode刷题之链表相关问题(js)

21.合并两个有序链表 var mergeTwoLists function(list1, list2) {if(list1null) return list2if(list2null) return list1let newHead new ListNode(0,null) //创建一个虚拟节点let cur newHeadlet cur1 list1,cur2 list2while(cur1&&cur2){if(cur1.val<cur2.…

PowerToys Windows 工具集

Microsoft PowerToys | Microsoft Learn Microsoft PowerToys&#xff1a;用于自定义 Windows 的实用工具 项目2023/04/1918 个参与者 反馈 Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装 …

Unity之效应器

主要作用&#xff1a;在一个区域内让游戏对象受到力和扭矩力的作用 1、创建一个精灵&#xff08;绿色区域&#xff09; 2、为其添加碰撞器&#xff08;要将Used By Effector和is Trigger打钩&#xff09; 3、添加效应器组件 4、区域效应器参数 Use Collider Mask&#xff1a;…

第3章 Class and Object

构造函数 Guaranteed initialization with the constructor使用构造函数保证初始化 • If a class has a constructor, the compiler automatically calls that constructor at the point an object is created, before client programmers can get their hands on the o…

Solidity基础五

暂时的一事无成也代表将来万事皆有可能&#xff01; 目录 一、对Solidity文件的理解 二、Solidity的导sol文件&#xff08;库、合约&#xff09; 三、Solidity的继承 1.继承的分类 2.继承的可见性 3.父合约构造函数的传参 4.调用父合约成员 5.重写 四、Solidity的抽象…

Solidity基础八

别慌&#xff0c;月亮也在大海某处迷茫 目录 一、Solidity 编程风格 1. 代码布局 2. 代码中各部分的顺序 3. 命名约定 二、Solidity 智能合约编写过程 1. solidity Hello World 2. 版本声明 3. 导入声明 4. 合约声明 三、Solidity 合约结构 智能合约 Test 四、So…

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…

EMLP2021 | Google大模型微调经典论文prompt tuning

一、概述 title&#xff1a;The Power of Scale for Parameter-Efficient Prompt Tuning 论文地址&#xff1a;https://arxiv.org/abs/2104.08691 代码&#xff1a;GitHub - google-research/prompt-tuning: Original Implementation of Prompt Tuning from Lester, et al, …

系列一、RuoYi前后端分离(登录密码加密)

一、部署前后端服务 http://doc.ruoyi.vip/ruoyi-vue/ 二、现象 若依前后端环境分离版本&#xff0c;本地部署好前后端环境后&#xff0c;访问登录接口密码是明文的&#xff0c;这样显然hi不安全的&#xff0c;如下图所示&#xff1a; 三、解决方法 3.1、加密流程 ①、后端…

Linux-0.11 文件系统namei.c详解

Linux-0.11 文件系统namei.c详解 模块简介 namei.c是整个linux-0.11版本的内核中最长的函数&#xff0c;总长度为700行。其核心是namei函数&#xff0c;即根据文件路径寻找对应的i节点。 除此以外&#xff0c;该模块还包含一些创建目录&#xff0c;删除目录&#xff0c;创建目…

Day2:Windows网络编程-TCP

今天开始进入Windows网络编程的学习&#xff0c;在学习的时候总是陷入Windows复杂的参数&#xff0c;纠结于这些。从老师的讲解中&#xff0c;这些内容属于是定式&#xff0c;主要学习写的逻辑。给自己提个醒&#xff0c;要把精力放在正确的位置&#xff0c;不要无端耗费精力。…

【JavaScript】文件分片上传

文章目录 普通文件上传分片上传整体流程技术点分析文件选择方式隐藏input框&#xff0c;自定义trigger拖拽上传 分片动态分片 计算哈希workerrequestIdleCallback抽样 请求并发控制进度展示手动中止/暂停 合并流式并发合并 反思分片命名问题并发控制代码实现的问题 参考文献 普…

ChatGPT桌面客户端支持gpt4模型,附使用说明

#软件核心功能&#xff1a; 1、支持OpenAI官方秘钥及API2D双秘钥使用&#xff1b;如果全局魔法&#xff0c;可以自己用官方秘钥&#xff1b;没魔法国内可直接使用API2D秘钥&#xff1b; 2、内置GPT4模型选项&#xff0c;如果你的官方秘钥支持可直接使用&#xff1b;你也可以注册…

【Labview如何显示数据库表格中的内容】

Labview如何显示数据库表格中的内容 前提操作思路框图 前提 已经成功将数据库与Labview相连接&#xff0c;若还没有链接可以查看&#xff1a;Labview与SQL Server互联 进行操作 操作 思路 首先创建一个表格控件&#xff0c;通过一个按钮启动程序&#xff0c;通过程序调用数…

SAP MM 根据采购订单反查采购申请

如何通过采购订单号查询到其前端的采购申请号。 首先从采购申请的相关报表着手&#xff0c;比如ME5A, 发现它是可以满足需求的。 例如&#xff1a;如下的采购订单&#xff0c; 该订单是由采购申请10003364转过来的。 如果想通过这个采购订单找到对应的采购申请&#xff0c;在…

Packet Tracer – 配置命名标准 IPv4 ACL

Packet Tracer – 配置命名标准 IPv4 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 192.168.10.1 255.255.255.0 N/A F0/1 192.168.20.1 255.255.255.0 N/A E0/0/0 192.168.100.1 255.255.255.0 N/A E0/0/1 192.168.200.1 255.255.2…

第五十五天学习记录:C语言进阶:动态内存管理Ⅲ

柔性数组 C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员。 柔性数组的特点&#xff1a; 。结构体中的柔性数组成员前面必须至少有一个其他成员。 。sizeof返回的这种结构大小不包括柔性数组的内存。 。包含柔性数组成员的结构…