(开始实战)WebApi第8讲:创建实战项目、连接数据库、查询数据库里的数据(using实例化上下文、依赖注入)

一、做一个什么样的项目?------招聘网站

二、创建项目

1、新建项目模板

在 ASP.NET Core 6 如何添加 Startup.cs - 董川民

2、获取NuGet包

(1)下载EntityFrameworkCore.SqlServer:对接SqlServer数据库。

(2)下载EntityFrameworkCore.Tool:工具包,使用Database First或 Code First时要进行数据映射,做这些工作时需要用这个Tool工具包。

否则无法从slserver的数据库里面把数据映射到实体中来,实体也无法映射到数据库中去。

三、连接数据库

1、在sqlserver里创建数据库

(1)设置登录用户名为sa,密码为123456。

(2)创建名为"JobRecruitment"的数据库

2、VS里连接数据库

(1)打开程序包管理器控制台

(2)Scaffold【关键字,释义断头刀】:使用这个命令可以把数据库映射到我们的这个项目中来

输入命令如下:

Scaffold-DbContext "Data Source=127.0.0.1;database=JobRecruitment ;uid=sa;pwd=123456**;TrustServerCertificate=true** " Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities

1>Scaffold-DbContextEF Core中提供的一个命令,可以从数据库表生成模型类

2>TrustServerCertificate=true: 在执行 Scaffold-DbContext 时直接在连接字符串中指定 TrustServerCertificate=true; 来绕过证书验证。这会强制客户端信任服务器提供的任何证书。

3>-OutputDir Entities:把实体输出到一个叫做Entities的文件夹中去

四、如何查询数据库里的数据?------上下文的使用和释放

1、什么是上下文?------数据库的上下文(称为DbContext),能将数据库中的数据表示为应用程序中的对象

是一个抽象类,需要定义一个从DbContext派生的类来表示数据库上下文,如四、3、(2)和(3)。

2、创建空的API控制器

3、using:using是指对这个上下文进行一个实例化。使用 using 语句可以在using{}大括号里的语句执行完后自动释放本实例跟数据库的连接,避免资源泄露。

(1)使用方法:通过JobRecruitmentcontext(表格)这个类实例化它的对象,然后就可以使用。

(2)举例:使用using读取JobRecruitmentcontext表格里的数据。

(3)例子能使用using的核心原因

1>JobRecruitmentcontext类继承了DbContext类,DbContext类继承了一个接口IDisposable
2>IDisposable 接口定义了一个方法 Dispose,它提供了一种机制来释放非托管资源。

(4)如果不使用using,则需要通过context.Dispose()方法去释放本实例跟数据库的一个的连接。

4、using的坏处:非常消耗电脑开销。

因为每一个调用的时候都需要使用using实例化一个它的上下文跟数据库产生一个连接,用完之后再释放。

5、EF6的静态化处理【麻烦】:线程单例,实例就只有它一个,每次使用的时候调用它就可以了。

如下图伪代码,dbContext是键,"dbContext"是值。

6、EFCore的静态化处理【推荐】

(1)在.net 5框架中,有startup.cs文件

参数IServiceCollection是一个依赖注入的容器,即IOC容器。

通过service.AddSinggleton()将context上下文注入到IOC容器中。

(2)在.net 6/7/8框架中,没有startup.cs文件,服务配置和请求管道的设置都迁移到了 Program.cs 文件中。

使用 builder.Services 来配置服务,两种写法如下图。

上面红框中的DefaultConnection 是连接字符串的名称,它应该在appsettings.json 文件或环境变量中配置。

(3)通过依赖注入在控制器或其他服务中使用 DbContext

1>依赖注入的工作原理

当ASP.NET Core框架创建一个TestController实例时,它会查看构造函数的参数,并尝试从依赖注入容器中解析这些参数。因为我们在ConfigureServices中(下图中绿色框内)已经注册了JobRecruitmentContext,所以框架能够自动解析并注入这个实例。

2>以四、4、(1)为例分析过程:

构造函数: TestController()构造函数,指图面红框的TestController()。

1)参数IServiceCollection是一个依赖注入的容器,即IOC容器。

通过service.AddSinggleton()将JobRecruitmentContext已经实例化好的注入到IOC容器中。

2)系统在创建TestController控制器的时候,会查找它这个控制器里面的构造函数,看看有没有相应的参数,是容器里面已经有的存放好的这么一个实例。

3)有的话则直接把容器里的这个实例传到这个构造函数的参数里面来,这个时候就拿到了一个已经实名化好的JobRecruitmentContext实例。

4)拿到JobRecruitmentContext实例后,再把这个实例传到准备好的这个成员变量 _context里面去。

5)如此,就可以直接去使用_contex实例。

_context就是在startup.cs里面已经实例化好并且已经存到IOC容器里面的这么一个上下文的类型的实例。

相关推荐
时光追逐者3 天前
.NET使用Moq开源模拟库简化单元测试
单元测试·开源·c#·asp.net·.net·.netcore
小吴同学·4 天前
.NET Core WebApi第1讲(概念):Web基础、AJAX、JQuery
.netcore
时光追逐者4 天前
一个基于.NET8+WPF开源的简单的工作流系统
开发语言·microsoft·c#·asp.net·.net·wpf·.netcore
小兜全糖(xdqt)6 天前
.net Core中使用sqlsugar
.netcore
GISer_Qing6 天前
ASP.NET Core8.0学习笔记(二十二)——单向导航属性
数据库·c#·.netcore·ef core·entityframework
weixin_497845547 天前
Ubuntu 通过Supervisor 或者 systemd 管理 .Net应用
ubuntu·.netcore
GISer_Qing8 天前
ASP.NET Core8.0学习笔记(二十一)——EFCore关系配置API
数据库·.netcore·ef core
时光追逐者8 天前
每天5分钟玩转C#/.NET之goto跳转语句
开发语言·c#·asp.net·.net·.netcore
工藤新一OL10 天前
.NET如何设置定时器
开发语言·c#·asp.net·.net·.netcore·visual studio