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.hqwc.cn/news/327637.html

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

相关文章

uniapp 文字超出多少字,显示收起全文按钮效果demo(整理)

收起展开 <template><view class"font30 color000 mL30 mR30"><text :class"showFullText ? : clamp-text">{{ text }}</text><view v-if"showToggleBtn && text.length > 42" click"toggleShowFu…

计算机组成原理 指令流水线

文章目录 指令流水线指令流水线的概念流水线性能分析流水线的吞吐率流水线的加速比流水线的效率 影响流水线的因素结构相关 (资源冲突)数据相关 (数据冲突)控制相关 (控制冲突) 流水线分类超量流水线 指令流水线 #mermaid-svg-vSsJnNqZf24LgjVK {font-family:"trebuchet m…

轻量检测模型NonoDet-Plus解析

官方解读&#xff1a;超简单辅助模块加速训练收敛&#xff0c;精度大幅提升&#xff01;移动端实时的NanoDet升级版NanoDet-Plus来了&#xff01; - 知乎 official implementation&#xff1a;https://github.com/RangiLyu/nanodet Backbone backbone部分没有变化&#xff0…

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时序预测对比

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现EEMD-SSA-BiLSTM、…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

Kettle Local引擎使用记录(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一&#xff1a;通过packages页面打包 1.下载packages app Distribution&#xff1a;自定义化更高&#xff0c;包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目&#xff1a;通过unix可执行文件postinstall.sh脚本实现通过ma…

软件测试|Docker exec命令详细使用指南

简介 Docker exec命令是Docker提供的一个强大工具&#xff0c;用于在正在运行的容器中执行命令。本文将详细介绍Docker exec命令的用法和示例&#xff0c;帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台&#xff0c;允许我们在容器中运行应用程序。有时候…

YOLOv5训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv5系列的绘图功能,我将向大家介绍YOLO系列的绘图功能。我们在进行实验时,经常需要比较多个结果,针对这一问题,我写了点代码来解决这个问题,它可以根据训练结果绘制损失(loss)和mAP(平均精度均值)的对比图。这个工具不仅支持多个文件…

MySQL数据库学习二

2 MySQL InnoDB 锁的基本类型 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 官网把锁分成了 8 类。所以我们把前面的两个行级别的锁&#xff08;Shared and ExclusiveLocks&#xff09;&#xff0c;和两个表级别的锁&#xff08;Intention Locks&#xff09;…

国内代理IP推荐!

国内代理IP&#xff0c;日更新50w IP&#xff0c;全国200城市&#xff0c;可利用率高达99%。提供HTTP/HTTPS/SOCKS5协议&#xff0c;满足数据采集、爬虫业务需求。丰富的api参数选择&#xff0c;可自由选择时效地区等&#xff0c;按需求过滤重复资源。低延迟&#xff0c;提供丰…

安全加密基础—基本概念、keytool、openssl

安全加密基础—基本概念、keytool、openssl 目录 前言 一、概念 明文通信 无密钥密文通信 对称加密 非对称加密 数字签名 消息摘要(MD5) CA数字证书(解决公钥分发的问题) HTTPS 相关文件扩展名 常用后缀名 普通的pem文件内容 二、keytool 2.1常用的命令如下 2…