C# Entity Framework 中不同的数据的加载方式

延迟加载

延迟加载是指在访问导航属性时,Entity Framework 会自动查询数据库并加载相关数据。这种方式在我们需要访问导航属性时比较方便,因为我们无需手动加载相关数据,而且只会在需要时才会进行查询,从而减少了不必要的开销。但是,如果我们需要访问多个导航属性,就可能会产生 N+1 问题,即需要执行多次查询来获取相关数据,从而影响性能。

及早加载

及早加载是指在查询主实体时,同时加载其关联实体,以避免 N+1 问题。这种方式需要使用 Include 方法来指定需要加载的导航属性,可以通过链式调用来指定多个导航属性。及早加载可以提高查询性能,但是也会增加数据传输量,因为可能会一次性加载大量数据。

显式加载

显式加载是指在需要时手动加载导航属性,适用于在已经查询到主实体的情况下,需要加载其关联实体的场景。这种方式需要使用 Load 方法来加载导航属性,可以使用 Collection 方法或者 Reference 方法来指定需要加载的导航属性。显式加载可以提高查询性能,因为只会查询需要的数据,但是需要手动编写代码来实现。

首先 安装俩程序包

先下载项目中安装 Entity Framework NuGet 包和Microsoft.EntityFrameworkCore.InMemory包
,不连接数据库。
Microsoft.EntityFrameworkCore.InMemory

步骤一 创建结构

在这里插入图片描述

步骤二 创建两个实体类

public class Author
{public int Id { get; set; }public string Name { get; set; }public ICollection<Book> Books { get; set; }
}
public class Book
{public int Id { get; set; }public string Title { get; set; }public int AuthorId { get; set; }public Author Author { get; set; }
}

步骤三 创建数据库上下文类

创建数据库上下文类 LibraryContext,LibraryContext 继承DbContext类
DbContext 是 Entity Framework 核心 API 之一,它表示应用程序与数据库之间的会话和操作。通过继承 DbContext 类,我们可以创建一个自定义的数据库上下文类,并在该类中定义数据集合(DbSet)和其他相关信息,以便进行查询、插入、更新和删除数据等一系列操作。

 public class LibraryContext : DbContext{public DbSet<Author> Authors { get; set; }public DbSet<Book> Books { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseInMemoryDatabase("Library"); // 使用内存数据库//optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Library;Integrated Security=True;");}}

步骤四 模拟数据的添加

 static void Main(string[] args){using (var context = new LibraryContext()){// 创建模拟数据var author1 = new Author { Id = 1, Name = "Author 1" };var author2 = new Author { Id = 2, Name = "Author 2" };var book1 = new Book { Id = 1, Title = "Book 1", AuthorId = 1, Author = author1 };var book2 = new Book { Id = 2, Title = "Book 2", AuthorId = 1, Author = author1 };var book3 = new Book { Id = 3, Title = "Book 3", AuthorId = 2, Author = author2 };// 将模拟数据添加到数据库context.Authors.AddRange(new List<Author> { author1, author2 });context.Books.AddRange(new List<Book> { book1, book2, book3 });context.SaveChanges();// 延迟加载var loadedAuthor = context.Authors.FirstOrDefault(a => a.Id == 1);var books = loadedAuthor.Books.ToList();Console.WriteLine($"Author Name: {loadedAuthor.Name}");foreach (var book in books){Console.WriteLine($"Book Title: {book.Title}");}// 及早加载var eagerLoadedAuthor = context.Authors.Include(a => a.Books).FirstOrDefault(a => a.Id == 2);var eagerLoadedBooks = eagerLoadedAuthor.Books.ToList();Console.WriteLine($"Author Name: {eagerLoadedAuthor.Name}");foreach (var book in eagerLoadedBooks){Console.WriteLine($"Book Title: {book.Title}");}// 显式加载var explicitLoadedAuthor = context.Authors.FirstOrDefault(a => a.Id == 1);context.Entry(explicitLoadedAuthor).Collection(a => a.Books).Load();Console.WriteLine($"Author Name: {explicitLoadedAuthor.Name}");foreach (var book in explicitLoadedAuthor.Books){Console.WriteLine($"Book Title: {book.Title}");}}Console.ReadLine();}

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

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

相关文章

Python基础-07(for循环、range()函数)

文章目录 前言一、for循环1.for循环结构2.参数 end&#xff08;使其输出时变为横向&#xff09; 二、range()函数1.range(常数)2.range(起始值&#xff0c;结束值)3.range(起始值&#xff0c;结束值&#xff0c;步长)4.例子 总结 前言 此章介绍循环结构中最常用的循环&#xf…

Redisson与SQL乐观锁:实现接口幂等性的终极指南与实战演示

Redisson与SQL乐观锁&#xff1a;实现接口幂等性的终极指南与实战演示 Redisson与SQL乐观锁&#xff1a;实现接口幂等性的终极指南与实战演示 接口幂等性.md

497 蓝桥杯 成绩分析 简单

497 蓝桥杯 成绩分析 简单 //C风格解法1&#xff0c;*max_element&#xff08;&#xff09;与*min_element&#xff08;&#xff09;求最值 //时间复杂度O(n)&#xff0c;通过率100% #include <bits/stdc.h> using namespace std;using ll long long; const int N 1e4 …

java基于VUE3+SSM框架的在线宠物商城+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【langchain】在单个文档知识源的上下文中使用langchain对GPT4All运行查询

In the previous post, Running GPT4All On a Mac Using Python langchain in a Jupyter Notebook, 我发布了一个简单的演练&#xff0c;让GPT4All使用langchain在2015年年中的16GB Macbook Pro上本地运行。在这篇文章中&#xff0c;我将提供一个简单的食谱&#xff0c;展示我们…

【Docker基础三】Docker安装Redis

下载镜像 根据自己需要下载指定版本镜像&#xff0c;所有版本看这&#xff1a;Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…

bootstrap教程

bootstrap教程 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同进入前端开发的世界&#xff0c;探索一款备受欢迎的前端框架——Bootstra…

修改安卓apk设置为安卓主屏幕(launcher)

修改安卓apk 将apk可以设置安卓主屏幕 原理&#xff1a; 将打包好的apk文件进行拆包增加配置文件在重新编译回apk包 需要得相关文件下载 解包 apktool :https://pan.baidu.com/s/1oyCIYak_MHDJCvDbHj_qEA?pwd5j2xdex2jar&#xff1a;https://pan.baidu.com/s/1Nc-0vppVd0G…

2024年学习计划

2024-2-29号完成 机器视觉基础知识学习&#xff0c;并可以处理视觉工作中的需求。 2024-3月份学习SCARA机械手应用开发SCARA机器人-埃斯顿自动化 - ESTUN 2024-4月份继续学习python 好了&#xff0c;今年可以完成这三个目标就满足了 好好学习&#xff0c;天天向上。每天进步…

【数据库系统概论】数据库并发控制机制——并发控制的主要技术之封锁(Locking)

系统文章目录 数据库的四个基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 数据库系统的三级模式和二级映射 数据库系统外部的体系结构 数据模型 关系数据库中的关系操作 SQL是什么&#xff1f;它有什么特点&#xff1f; 数据定义之基本表的定义/创建、修改和…

Vue CLI组件通信

目录 一、组件通信简介1.什么是组件通信&#xff1f;2.组件之间如何通信3.组件关系分类4.通信解决方案5.父子通信流程6.父向子通信代码示例7.子向父通信代码示例8.总结 二、props1.Props 定义2.Props 作用3.特点4.代码演示 三、props校验1.思考2.作用3.语法4.代码演示 四、prop…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第四天-Linux管道练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

爬虫网易易盾滑块案例:某乎

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、滑块初步分析 js运行 atob(‘aHR0cHM6Ly93d3cuemhpaHUuY29tL3NpZ25pbg’) 拿到网址&#xff0c;浏览器打开网站&#xff0…

Java十种经典排序算法详解与应用

数组的排序 前言 排序概念 排序是将一组数据&#xff0c;依据指定的顺序进行排列的过程。 排序是算法中的一部分&#xff0c;也叫排序算法。算法处理数据&#xff0c;而数据的处理最好是要找到他们的规律&#xff0c;这个规律中有很大一部分就是要进行排序&#xff0c;所以需…

python总结-装饰器

装饰器 装饰器解决日志问题&#xff08;分三个版本&#xff09;多个装饰器带参数的装饰器wraps装饰器内置装饰器property装饰器staticmethod装饰器classmethod装饰器 类装饰器 概念 装饰器来自 Decorator 的直译。什么叫装饰&#xff0c;就是装点、提供一些额 外的功能。在 pyt…

一个可能的网址服务器证书自动续期自动化实现脚本方案

需求背景&#xff1a; 目标: 您希望为您的网站启用HTTPS&#xff0c;以保护通信安全&#xff0c;并希望这个过程是免费的。 证书类型: 您需要获取SSL/TLS证书&#xff0c;并且希望证书能够自动续期&#xff0c;以确保网站不会因证书过期而停机。 服务器兼容性: 您希望生成的证…

idea2023连接gitee远程仓库

目录 1.在gitee创建远程仓库 2.在Idea里配置git 3.初始化本地仓库 4. 提交推送至远程仓库 注意&#xff1a;提前下好git工具、idea2023&#xff0c;注册gitee账号&#xff0c;本文不介绍 1.在gitee创建远程仓库 创建好后&#xff0c;复制远程仓库地址 2.在Idea里配置git ​ …

【MATLAB源码-第104期】基于matlab的MPSK和MQAM调制解调方式仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 MPSK&#xff08;多相位键控&#xff09; MPSK是一种基于载波相位变化的数字调制技术。它的核心原理是通过改变载波的相位来表示不同的数字信息。这种技术可以分为几个不同的级别&#xff0c;其中最常见的包括&#xff1a; 1…

【书生·浦语大模型实战营02】《轻松玩转书生·浦语大模型趣味Demo》学习笔记

《轻松玩转书生浦语大模型趣味Demo》 1、InternLM-Chat-7B 智能对话&#xff1a;生成 300 字的小故事 本节中我们将使用InternLM-Chat-7B 模型部署一个智能对话 Demo。 1.1 环境准备 在InternStudio平台中选择 A100(1/4) 的配置&#xff0c;镜像选择 Cuda11.7-conda&#x…