查缺补漏系统学习 EF Core 6 (一)

推荐关注「码侠江湖」星标,时刻不忘江湖事

掌握 ORM 开发方式是每一个 .NET 开发者所必备的技能,而且 .NET 平台有很多优秀的 ORM 框架。

很多人都会诟病 .NET 官方标配的 Entity Framework,感觉其笨重难用、性能低下。

但其实经过多年发展,EF Core 已经是 .NET 平台中的新一代 ORM 框架。

虽然是上一代 EF 的跨平台版本,但在其本就无比安全稳定的基础上,做了很多的改进,摒弃了一些包袱、优化了性能,丰富了扩展等。

这个系列的目的,就是全面的讲述 EF Core,让大家对其有一个系统的了解,内容较为精炼,不会有太多废话。

1c8bb4795b806e826b218dbbd0aec64d.png

基础概念

想要使用 EF Core,必须安装 Microsoft.EntityFrameworkCore 库,它提供了 EF Core 核心功能。

除此之外,我们还需要安装与你使用的数据库相匹配的数据库提供程序。

比如,本文示例使用的是 SQL Server LocalDB,所以我需要安装 Microsoft.EntityFrameworkCore.SqlServer库。

模型

EF Core 是一个 ORM 框架。

什么是 ORM?也就是 「Object Relational Mapping」,对象关系映射。

这里的 Object ,在 EF Core 中,以实体类来表示。

实体类是 EF Core 用于映射到数据库表的一个类。

在这个示例中,有一个 Entities 文件夹,用来存放与 EF Core 相关的实体类,里面有一个名为 Account 的实体类。

166f158186dbe9d624b45b6b40e77ac6.png

EF Core 中有一系列的规则,来帮助它将实体类映射到数据库表中。

Account 实体类为例,这个映射过程很简单:

66efb377810953bb88b502559d9e8826.png

首先,EF Core 通过实体类,拥有了用于列和配置映射的表的信息。

接下来,这个类中的所有公共属性,都会被映射到表的列中,并具有与属性相同的名称。

最后,EF Core 使用命名约定,在数据库表中从 AccountId 属性中,创建一个主键。

连接字符串

EF Core 是一个面向数据库的 ORM 框架,我们就必须为它提供数据库的信息,也就是数据库连接字符串。

一般情况下,我们使用 「appsettings.json」 配置文件,为 EF Core 提供连接字符串。

{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=CodeMan;Trusted_Connection=True;MultipleActiveResultSets=true"}
}

在这个示例中,提供的连接字符串是,SQL Server LocalDB 中的默认实例,指定的数据库名称是 「CodeMan」

需要注意的是,由于连接字符串属于敏感信息,所以使用配置文件来存储连接字符串,并不是最好的做法,特别是对于生产环境。

那么针对生产环境,更好的方法就是使用环境变量来提供诸如连接字符串的敏感信息。

依赖注入

EF Core 中有一个非常重要的东西,就是数据上下文类。

在这个示例中,Entities 目录中的 ApplicationContext 类型,就是 EF Core 在当前应用中的上下文类。

9a2b60afdd8fc8eac32371a8c7314180.png

这个类必须继承自 DbContext 基类,它包含访问数据库的信息和配置。

构造函数使用 DbContextOptions 参数,为基类提供额外的选项。

其中最重要的是 DbSet<Account> 类型的 Accounts 属性。

EF Core 会在上下文类中,查找所有的公共 DbSet 属性,将它们的名称映射到数据库中的表的名称。

然后,它会进入 DbSet<T> 提供的泛型类,在我们的例子中,它是一个 Account 类,并将所有的公共属性,映射到表中具有相同名称和类型的列。

如果 Account 类对其他类有任何引用,EF Core 还会使用这些引用属性,并在数据库中创建相应的关系。

让我们回到在 Main 方法中:

4b336551bb3da93f44e2f382e627196d.png

首先,我们创建了一个读取 appsettings.json 配置文件的配置对象,用来获取连接字符串

然后,在依赖注入系统中,通过使用 AddDbContext 方法,来注册 ApplicationContext 上下文类

在它的配置委托中,使用 UseSqlServer 方法,设置连接字符串。

在这个示例中,还注册了一个 AccountService 服务,该服务的实现类,通过构造函数注入了上下文实例。

这样我们就可以在服务类中,使用上下文实例。

上下文池

需要注意的是,在EF Core 中,注册上下文类的方法有两种:

AddDbContext 方法注册的上下文类型,生命周期模式默认是作用域,这个作用域的范围是线程,在 ASP.NET Core 应用中作用域的范围表现为一个请求。

因为上下文实例是非线程安全的,所以我们一般不需要去修改它的生命周期模式。

另外还有一个 AddDbContextPool 方法,它用来配置上下文实例池。

1d0874454f27c711dda6d158fef5b256.png

上下文池可以重复使用上下文实例,而不是为每个请求创建新的实例。

当应用请求上下文实例时 EF Core 会首先检查池中,是否有可用的实例。

请求处理完成后,上下文实例的任何状态都会被重置,然后回到池中。

也就是说,保存在池中的可以复用的上下文实例,它不会再被初始化。所以,它不太适合在每一次使用它,都需要初始化的场景。

上下文池可以提高大型 Web 应用的吞吐量。默认情况下,池中保持的上下文实例数是 1024 个,这个值可以通过 poolSize 参数进行修改,示例中修改为 2048 个。

一旦池中保存的实例数超出池大小,就不会再保存新的上下文实例,此时 EF Core 会回退到「按需创建实例的非池行为」

池的大小需要根据实际情况去设置,池容量太小,如果不够用就会回退到非池行为,此时池的意义不大。

如果池容量太大,则可能消耗不必要的内存,因为未使用的上下文实例,也保留在池中。

一般情况下,池的性能提升通常可以忽略不计,除非是在高度优化的方案中。

上下文类

我们现在再回头看一看 ApplicationContext 上下文类:

3b4f560f141e5f75d4cd56f6aeec29d1.png

它的构造函数中,接受了一个 DbContextOptions 类型的参数,这个参数用来提供上下文的选项。

除了直接使用 DbContextOptions 类型,还可以使用泛型版本 DbContextOptions 类型。

public ApplicationContext(DbContextOptions<ApplicationContext> options)

无论使用哪个版本,我们的应用都会正常工作。

使用哪一个版本,取决于你的应用中是否有多种上下文类型。

如果应用中有多种上下文类型,就推荐使用泛型版本,而当前示例的情况并非如此,所以使用的是非泛型版本。

DbContext有三个重要的属性:

  • Database 属性负责与数据库的交互、数据库的迁移/创建和原始 SQL 查询。

  • ChangeTracker 属性用于跟踪通过同一上下文实例,查询出的实体状态。

  • Model 属性提供了对 EF Core 在连接,或创建数据库时,使用的数据库模型。

我们可以使用 Model 属性,来访问每个实体及其属性的信息。

不过,这需要我们安装 Microsoft.EntityFrameworkCore.Relationa 库。

然后在 AccountService 实现类的 Run 方法中,就可以通过使用上下文实例的 Model 属性,找到上下文中的任意实体,并获取它的一些信息,比如表名和主键字段名。

小结

这篇文章,讲述了 EF Core 的一些基本概念:模型、连接字符串、依赖注册、上下文池与上下文类。

下篇文章,我们将盘点一下 EF Core 的属性配置。

更多精彩内容,请关注我▼▼

4bb48140a5470dea7dd7e0639ea0f6c8.gif

如果喜欢我的文章,那么

在看和转发是对我最大的支持!

(戳下面蓝字阅读)

03ef2db7e3ccfd1c7079fda0baaf324f.png

推荐关注微信公众号:码侠江湖

                        6c4084e1eca54d504a480c8331255af5.png觉得不错,点个在看再走哟

7301f26356a44c4c511715e61b1b18cc.gif

如果喜欢我的文章,那么

在看和转发是对我最大的支持!

(戳下面蓝字阅读)

09e90918c268982ec6cef3f5b96c090b.png

推荐关注微信公众号:码侠江湖

                        fc04a37bca55a777c52dd6d08c4ed09e.png觉得不错,点个在看再走哟

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

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

相关文章

【经典回放】JavaScript学习详细干货笔记之(一)

【经典回放】JavaScript学习详细干货笔记之&#xff08;一&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;二&#xff09; 【经典回放】JavaScript学习详细干货笔记之&#xff08;三&#xff09; 目录 一、为什么要学JavaScript 二、JavaScript经典案例 …

TCP之三次握手和四次挥手过程

1 TCP包头里面的标志位 下图为TCP头部里面部分信息,入下标志位,每个标志位占一位。 标志位这里会涉及3个,ACK SYN FIN ACK:确认序号有效。 SYN:发起一个新连接。 FIN:释放一个连接。 2 三次握手过程 第一次握手 Client将标志位SYN置1,随机产生一个值seq=J,并将数…

gearman mysql编译_gearman初探(一、编译和安装)

gearman是一个任务分发系统&#xff0c;将计算比较耗时的任务分发给不同的机器专门进行计算&#xff0c;而任务发起的初始程序不必等待这些任务完成就可以返回而继 续执行。笔者最开始做PHP邮件发送的时候&#xff0c;因为邮件发送耗时比较长&#xff0c;这时PHP脚本就会被阻塞…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(四)了解魔法百宝箱列表、字典及基本数据类型

学习目标 了解魔法世界中可更改容器——变量了解魔法世界的基本数值类型——字符串、整数了解魔法百宝箱——字典、列表了解列表如何添加值了解字典如何添加值了解字典与列表定义的不同符号 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&…

TCP协议之如何保证传输的可靠性

一、问题 TCP协议之如何保证传输的可靠性?我们先看下TCP的头部图片和TCP头部的字段 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口号16bitshort m_sDestPort;       // 目的端口号16bitunsigned int …

【工具篇】在Mac上开发.Net Core需要的工具

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常开发技巧,如需帮助&#xff0c;请后台留言&#xff1b;[如果觉得本公众号对您有帮助&#xff0c;欢迎关注]在Mac上开发.Net Core需要的工具如果您是一个.NET 开发者&#xff0c;想从Windows切换到Mac上开发.NET或者您已…

【Pix4d精品教程】Pix4Dmapper完整航测内业操作流程手把手图文教程

1. 作业流程图 2. 原始资料准备 原始资料包括影像数据、POS数据以及控制点数据。 确认原始数据的完整性,检查获取的影像中有没有质量不合格的相片。同时查看POS数据文件,主要检查航带变化处的相片号,防止POS数据中的相片号与影像数据相片号不对应,出现不对应情况应手动调…

mysql semi join_MySQL 5.6 Semi join优化之materialization strategy

8月 24, 2014 |Nix.Huang考虑如下查询&#xff1a;select * from Countrywhere Country.code IN (select City.Countryfrom Citywhere City.Population > 7*1000*1000)and Country.continentEurope这个子查询是非相关子查询&#xff0c;我们能和外层循环独立的执行它&#x…

【ArcGIS风暴】何为动态投影?这次全面为您揭开ArcGIS中动态投影的神秘面纱!

本课程配套蓝光视频: 【ArcGIS风暴】GIS动态投影问题 GISer们都见过以下警告,该警告的原因是当前加载的数据的坐标系和当前数据框坐标系不一致导致的,核心问题是地理坐标系不一致。如当前数据的坐标系是GCS_Xian_1980,而数据框的坐标系有可能是WGS_1984等,总之跟要加载的数…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(五)我的魔法竟然有了一丝逻辑

学习目标 了解魔法世界中的结构表现——缩进了解魔法世界的逻辑判断——if了解魔法世界的多次逻辑判断——ifelse嵌套了解魔法世界中的逻辑运算——且 and 与或 or 推荐 1.《备受好评的看得懂的C语言入门教程》 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的P…

类和类之间的关系

一、类和类之间的关系 UML类图中&#xff0c;常见以下几种关系: 1、泛化&#xff08;Generalization&#xff09; 是一种继承关系&#xff0c;比如动物类和老虎类&#xff0c;老虎继承动物&#xff0c;子类如何特化父类的所有特征和行为 箭头指向:带三角箭头的实线&#xff0…

查缺补漏系统学习 EF Core 6 - 实体配置

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第二篇文章&#xff0c;上一篇文章讲解了 EF Core 的一些基础概念&#xff0c;这一篇文章主要围绕实体属性的配置。点击上方或后方蓝字&#xff0c;阅读 EF Core 系列合集。实体配置配置实体的目的&am…

mysql innodb 索引 延迟更新_Mysql覆盖索引与延迟关联

延迟关联&#xff1a;通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。为什innodb的索引叶子节点存的是主键&#xff0c;而不是像myisam一样存数据的物理地址指针&#xff1f;如果存的是物理地址指针不就不需要二次查找了吗&#xff0c;根据myisam和inn…

Android之在笔记本电脑adb devices识别不了oppo A9手机(设备管理器ADB Interface里面有个黄色感叹号)

1 问题 记本电脑adb devices识别不了oppo A9手机&#xff08;设备管理器ADB Interface里面有个黄色感叹号&#xff09; 图片如下 2 分析 很明显这里是驱动问题&#xff0c;ADB Interface有感叹号提示&#xff0c;所以这里需要解决驱动问题 3 解决办法 1&#xff09;可以尝试…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(六)精简魔法更强大

学习目标 了解对相似逻辑的简化编写——循环 推荐 1.《备受好评的看得懂的C语言入门教程》 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第二篇&#xff1a;《假…

Tiny模板语言(VelocityPlus)初步入门

2019独角兽企业重金招聘Python工程师标准>>> 1 关于用户手册 本文主要介绍如何在模板中使用Tiny模板语言&#xff0c;通过查阅本手册&#xff0c;可以对Tiny模板语言 TTL(Tiny Template Language)的用法有一个较全面的认识&#xff0c;并学会如何有效地使用Tiny模板…

『技术群里聊些啥』.NET 如何计算文件 MD5 哈希

前言有网友在交流群中询问&#xff0c;文件 MD5 是全部读取到内存后计算出来的&#xff0c;还是拿到流就可以计算出来了&#xff1a;原理上来说&#xff0c;MD5 需要对全部内容做运算&#xff0c;所以应该是获取所有内容后再计算的。但是&#xff0c;如果全部读取到内存后再计算…

探索发现:平台云——云的新风向

本文讲的是探索发现&#xff1a;平台云——云的新风向&#xff0c;云主机&#xff0c;自2011年火热崛起之后&#xff0c;成为IDC行业替代VPS的完美系列&#xff0c;它的成功在于其相对于VPS的压倒性优势;而平台云凭借其的便捷的操作、实时监控和可视化服务&#xff0c;让站长们…

windows下配置mysql主从复制_Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库)。主数据库一般是实时的业务数据写入和更新操作&#xff0c;从数据库常用的读取为主。主从复制过程&#xff1a;1、主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制…

【ArcGIS风暴】全国1:100万基础地理数据库获取及ArcGIS图幅完美拼接---以甘肃省为例

在日常工作中,如第三次全国国土调查、不动产登记等,我们总需要对图斑、线状等数据进行数据分幅、图幅拼接等操作。另外,日常学习工作中,无论是制图还是进行分析,都不可避免的需要使用一些基础地理数据,像行政边界、水系、道路、居民地等等,那么,这些基础地理数据有没有…