查缺补漏系统学习 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,一经查实,立即删除!

相关文章

mysql 5.5 mysqldump_mysql 5.5 mysqldump 原文翻译

根据mysql 5.5第6.4章节理解和自己翻译水平有限如有纰漏请指教,原文如下.6.4 使用mysqldump备份(Using mysqldump for Backups)首先多余的不用说了备份用来干什么大家都清楚。mysqldump备份分两种输出形式&#xff1a;1. 无--tab选项&#xff0c;输出标准的SQL格式。输出包含CR…

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

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

Java Attach API

catalog 1. instrucment与Attach API 2. BTrace: VM Attach的两种方式 3. Sun JVM Attach API 1. instrucment与Attach API JDK5中增加了一个包java.lang.instrucment&#xff0c;能够对JVM底层组件进行访问。在JDK 5中&#xff0c;Instrument 要求在运行前利用命令行参数或者系…

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

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

Handler 机制分析

android 子线程和UI线程的交互主要使用Handler的方法进行通信。本文分析Handler机制 Handler 如何使用&#xff1f; Handler的使用比较简单 public class MainActivity extends Activity{private Handler handler new Handler() { public void handleMessage(Message msg) { …

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数据中的相片号与影像数据相片号不对应,出现不对应情况应手动调…

关于构造函数和this调用的思考

文中一系列思考和内容引发自以下问题&#xff1a;我需要在一个类的构造函数中调用另一个对象的构造函数&#xff0c;并使用this初始化其中的一个引用成员。 主要遇到的问题&#xff1a; 1. 构造函数的初始化列表中能访问this吗&#xff1f; 很明显c创建一个对象分为两部分&…

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…

Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数

一、问题 我们调用数据&#xff0c;大都是可以直接获取表中的数据&#xff0c;或者用复杂点的sql语句组成的。但是&#xff0c;有时候&#xff0c;当这样达不到我们要的全部数据的时候&#xff0c;这时&#xff0c;我们就用到了存储过程【sp】&#xff0c;如果sp需要参数是数组…

js模拟blur

<div></div> 某个事件给div加个属性 $(div).attr(wait,true); $(div).click(function() { if(false!$(this).attr(wait)) return false; })转载于:https://www.cnblogs.com/cndxk/p/4788414.html

中国第一朵企业云

本文讲的是中国第一朵企业云&#xff0c;【IT168 资讯】算起来&#xff0c;中国中化集团公司的ERP完全运行在“云”上已经一个多月了&#xff0c;每每提到这个“创举”&#xff0c;信息技术部总经理彭劲松显得有些兴奋&#xff0c;却仍然很谨慎。作为中国第一家企业云的实践者&…

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

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

【ArcGIS风暴】捕捉VS经典捕捉,谁更有用武之地?

几乎所有的GIS软件都具有捕捉功能!今天我们一起来聊一聊ArcGIS软件中的捕捉功能吧。 ArcGIS软件中有两个重要的捕捉工具:捕捉和经典捕捉。 目录 一、捕捉(Snapping) 1、捕捉类型 2、捕捉选项