ASP.NET Core与RESTful API学习笔记 四、Entity Framework Core
简介
Entity Framework Core(EF Core)是微软的一个ORM(Object Relational Mapping)框架,基于ASP.NET Core平台。ORM对象关系映射是一种为解决高级编程语言中的对象和关系数据库之间映射关系的技术,将程序中的对象自动持久化到关系数据库中,并将数据库中的数据信息自动映射到程序中的对象。
- EF Core能够处理.NET对象与多个关系数据库之间的映射,依赖数据库提供的程序(Database Provider),它负责.NET对象与数据库之间通信。
- EF Core支持LINQ(集成语言查询)。
- EF Core有两种使用方式:代码优先(Code-First)和数据库优先(Database-First)。
使用EF Core
在项目中添加EF Core
从ASP.NET Core 3.0起,Microsoft.AspnetCore.App将不再包含EF Core包,若要在项目中使用EF Core,需要根据项目使用的数据库手动添加相对应的NuGet包到项目中。参考微软官方实体框架文档
-
通过VS Studio的包管理器安装sql server的NuGet程序包:
从 Visual Studio 菜单中选择“工具”>“NuGet> 包管理器”>“管理解决方案的NuGet程序包”,搜索并选择所需要的包进行安装即可。需要的包有:
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools -
或在 "程序包管理器控制台"里输入:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
使用EF Core–代码优先
所谓代码优先,是指EF Core能够根据已创建好的实体类创建数据库和表。
- 对数据库的所有操作均应通过代码来实现。
- EF Core用于同步代码到数据库的方法是迁移(Migration)。所谓迁移,是EF Core以增量的方式修改数据库和表结构,并使用应用程序的实体类和数据库保持一致,且不会影响数据库中现有数据方式。
使用步骤:
- 在项目中添加EF Core NuGet包;
- 创建实体类,每个实体类代表数据库中的一张数据表;
- 创建一个继承自DbContext的类,表示要操作的数据库上下文;
- 在Startup类的ConfigureService()方法中将创建的DbContext添加到容器中;
public void ConfigureServices(IServiceCollection services)
{
// 将DbContext添加到容器中
services.AddDbContext<LibraryDbContext>(option =>
{
// 配置数据库连接参数(从appsetting.json配置文件中获取)
option.UseSqlServer(Configuration.GetConnectionString("SqlServerConn"));
});
}
- 在“程序包管理器控制台”中使用Add-Migration [迁移名称] 命令创建迁移, 然后使用Update-Database 命令使迁移中的操作应用到数据库中。首次迁移执行操作后,会创建数据库和其中数据表。
// 程序包管理器控制台,输入以下命令
Add-Migration InitCreation // 会在项目创建迁移文件夹Migrations
Update-Database // 将迁移应用到数据库
...
Remove-Migration InitCreation // 删除最后一次迁移
...
//Script-Migration -From 0 -To migrationName2 -Context ContextName
Script-Migration -Output script/library.sql // 上生产之前,生成迁移文件对应的SQL脚本文件到指定目录
使用EF Core–数据库优先
所谓数据库优先,是指EF Core能够根据已创建好的数据库和表来生成相匹配的实体类。在“程序包管理器控制台”中使用Scaffold-DBContext命令即可根据指定的数据库生成相应的代码。
注意:
EF Core对于查询的执行采用延迟执行的方式。在程序中使用LINQ对数据库进行查询时,并未立即执行,仅在相应的变量中存储了查询命令,只有遇到实际需要结果的操作时,查询才会执行。查询延迟执行的好处是在得到最终结果之前,能够对结果集进行筛选和排序,性能更高效。遇到如下操作时,查询会执行:
- 对结果集作用for或foreach循环;
- 使用了ToList()、ToArray()和ToDictionary()等方法;
- 使用了Single()、Count()、Average()、First()和Max()等方法。
AutoMapper是一个对象映射库,以NuGet包的形式存在,项目中要使用DTO,先在“管理包管理器”中添加"AutoMapper.Extensions.Microsoft.DependencyInjection"。
也可以在“程序包管理器控制台”输入:
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -Version 11.0.0