一、做一个什么样的项目?------招聘网站
二、创建项目
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-DbContext:
EF 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容器里面的这么一个上下文的类型的实例。