Entity Framework Core 工具参考 - Visual Studio 中的包管理器控制台
Entity Framework Core 的包管理器控制台 (PMC) 工具执行设计时开发任务。 例如,可以创建迁移、应用迁移,并为基于现有数据库的模型生成代码。 命令在 Visual Studio 中使用包管理器控制台运行。 这些工具同时适用于 .NET Framework 和 .NET Core 项目。
如果未使用 Visual Studio,则建议改为使用 EF Core 命令行工具。 .NET Core CLI 工具是跨平台的,它在命令提示符中运行。
警告
本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。
安装工具
在“包管理器控制台”中运行以下命令,安装包管理器控制台工具:
Install-Package Microsoft.EntityFrameworkCore.Tools
在“包管理器控制台”中运行以下命令来更新工具。
Update-Package Microsoft.EntityFrameworkCore.Tools
验证安装
运行以下命令,验证是否已安装这些工具:
Get-Help about_EntityFrameworkCore
输出如下所示(它不会告诉你使用的工具版本):
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
TOPIC
about_EntityFrameworkCore
SHORT DESCRIPTION
Provides information about the Entity Framework Core Package Manager Console Tools.
<A list of available commands follows, omitted here.>
使用工具
使用这些工具之前:
- 了解目标项目和启动项目之间的差异。
- 了解如何将工具与 .NET Standard 类库一起使用。
- 对于 ASP.NET Core 项目,请设置环境。
目标项目和启动项目
命令会引用项目和启动项目。
项目也称为目标项目,因为它是命令添加或删除文件的位置。 默认情况下,包管理器控制台中选择的默认项目就是目标项目。 可以使用
参数将另一个项目指定为目标项目。-Project
启动项目是工具生成并运行的项目。 这些工具必须在设计时执行应用程序代码,才能获取有关项目的信息,例如数据库连接字符串和模型的配置。 默认情况下,“解决方案资源管理器”中的“启动项目”就是启动项目。 可以使用
参数将另一个项目指定为启动项目。-StartupProject
启动项目和目标项目通常是同一项目。 它们是单独项目的一个典型场景是:
- EF Core 上下文和实体类均在 .NET Core 类库中。
- .NET Core 控制台应用或 Web 应用引用类库。
还可以将迁移代码放置在独立于 EF Core 上下文的类库中。
其他目标框架
包管理器控制台工具适用于 .NET Core 或 .NET Framework 项目。 在 .NET Standard 类库中具有 EF Core 模型的应用可能没有 .NET Core 或 .NET Framework 项目。 例如,Xamarin 和通用 Windows平台应用也是如此。 在这种情况下,可以创建一个 .NET Core 或 .NET Framework 控制台应用项目,该项目的唯一用途是充当工具的启动项目。 启动项目可以是不包含实际代码的虚拟项目 - 需要它的唯一理由是为工具提供一个目标。
为什么需要虚拟项目? 如前所述,这些工具必须在设计时执行应用程序代码。 为此,它们需要使用 .NET Core 或 .NET Framework 运行时。 当 EF Core 模型位于面向 .NET Core 或 .NET Framework 的项目中时,EF Core 工具会从项目中借用运行时。 如果 EF Core 模型位于一个 .NET Standard 类库中,则不能这样做。 .NET Standard 不是实际的 .NET 实现;它是 .NET 实现必须支持的一组 API 的规范。 因此,.NET Standard 不足以让 EF Core 工具执行应用程序代码。 创建用作启动项目的虚拟项目提供了一个具体的目标平台,工具可以在其中加载 .NET Standard 类库。
ASP.NET Core 环境
可以在命令行上为 ASP.NET Core 项目指定环境。 此参数和任何其他参数都将传递到 Program.CreateHostBuilder 中。
Update-Database -Args '--environment Production'
通用参数
下表显示了所有 EF Core 命令的通用参数:
参数 | 说明 |
---|---|
-Context <String> |
要使用的 DbContext 类。 仅类名或完全限定命名的空间。 如果省略此参数,EF Core 将查找上下文类。 如果有多个上下文类,则此参数是必需的。 |
-Project <String> |
目标项目。 如果省略此参数,则包管理器控制台的默认项目将用作目标项目。 |
-StartupProject <String> |
启动项目。 如果省略此参数,则解决方案属性中的启动项目将用作目标项目。 |
-Args <String> |
传递给应用程序的参数。 |
-Verbose |
显示详细输出。 |
若要显示有关命令的帮助信息,请使用 PowerShell 的 Get-Help
命令。
提示
Context
、Project
和 StartupProject
参数支持 Tab 键扩展。
Add-Migration
添加新的迁移。
参数:
参数 | 说明 |
---|---|
-Name <String> |
迁移的名称。 这是一个位置参数,并且是必需的。 |
-OutputDir <String> |
用于输出文件的目录。 路径相对于目标项目目录。 默认路径为“Migrations”。 |
-Namespace <String> |
要用于生成的类的命名空间。 默认为从输出目录生成的命名空间。 |
上文中列出了通用参数。
Bundle-Migration
创建可执行文件以更新数据库。
参数:
参数 | 说明 |
---|---|
-Output <String> |
要创建的可执行文件的路径。 |
-Force |
覆盖现有文件。 |
-SelfContained |
同时绑定 .NET 运行时,因此不需要在计算机上安装它。 |
-TargetRuntime <String> |
要绑定的目标运行时。 |
-Framework <String> |
目标框架。 默认为项目中的第一个。 |
上文中列出了通用参数。
Drop-Database
删除数据库。
参数:
参数 | 说明 |
---|---|
-WhatIf |
显示要删除的数据库,但不删除它。 |
上文中列出了通用参数。
Get-DbContext
列出并获取有关可用 DbContext
类型的信息。
上文中列出了通用参数。
Get-Migration
列出可用的迁移。
参数:
参数 | 说明 |
---|---|
-Connection <String> |
用于连接到数据库的连接字符串。 默认为 AddDbContext 或 OnConfiguring 中指定的值。 |
-NoConnect |
不要连接到数据库。 |
上文中列出了通用参数。
Optimize-DbContext
生成 DbContext
使用的模型的已编译版本。
有关详细信息,请参阅已编译的模型。
参数:
参数 | 说明 |
---|---|
-OutputDir <String> |
要在其中放置文件的目录。 路径相对于项目目录。 |
-Namespace <String> |
要用于所有生成的类的命名空间。 默认设置为从根命名空间和输出目录以及 CompiledModels 生成。 |
上文中列出了通用参数。
注意
PMC 工具目前不支持生成 NativeAOT 编译和预编译查询所需的代码。
下面的示例使用默认值,如果项目中只有一个 DbContext
,则可以正常运行:
Optimize-DbContext
下面的示例为具有指定名称的上下文优化模型,并将该模型放置在单独的文件夹和命名空间中:
Optimize-DbContext -OutputDir Models -Namespace BlogModels -Context BlogContext
Remove-Migration
删除上次迁移(回退为迁移所做的代码更改)。
参数:
参数 | 说明 |
---|---|
-Force |
还原迁移(回退应用到数据库的更改)。 |
上文中列出了通用参数。
Scaffold-DbContext
为 DbContext
生成代码,并为数据库生成实体类型。 为了让 Scaffold-DbContext
生成实体类型,数据库表必须具有主键。
参数:
参数 | 说明 |
---|---|
-Connection <String> |
用于连接到数据库的连接字符串。 该值可以是 name=name of< 连接字符串>。 在这种情况下,名称来自 为项目设置的配置源 。 这是一个位置参数,并且是必需的。 |
-Provider <String> |
要使用的提供程序。 通常,这是 NuGet 包的名称,例如:Microsoft.EntityFrameworkCore.SqlServer 。 这是一个位置参数,并且是必需的。 |
-OutputDir <String> |
要在其中放置实体类文件的目录。 路径相对于项目目录。 |
-ContextDir <String> |
要在其中放置 DbContext 文件的目录。 路径相对于项目目录。 |
-Namespace <String> |
要用于所有生成的类的命名空间。 默认设置为从根命名空间和输出目录生成。 |
-ContextNamespace <String> |
要用于生成的 DbContext 类的命名空间。 注意:重写 -Namespace 。 |
-Context <String> |
要生成的 DbContext 类的名称。 |
-Schemas <String[]> |
要为其生成实体类型的表和视图的架构。 如果省略此参数,则包含所有架构。 如果使用此选项,架构中的所有表和视图都将包含在模型中,即使未使用 -Table 显式包含它们也是如此。 |
-Tables <String[]> |
要为其生成实体类型的表和视图。 可以使用“schema.table”或“schema.view”格式包含特定架构中的表或视图。 如果省略此参数,则包含所有表和视图。 |
-DataAnnotations |
使用属性配置模型(如果可能)。 如果省略此参数,则仅使用 Fluent API。 |
-UseDatabaseNames |
使用与数据库中显示的名称完全相同的表、视图、序列和列名称。 如果省略此参数,数据库名称将更改为更符合 C# 名称样式约定。 |
-Force |
覆盖现有文件。 |
-NoOnConfiguring |
不生成 DbContext.OnConfiguring 。 |
-NoPluralize |
请勿使用复数化程序。 |
上文中列出了通用参数。
示例:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
示例仅搭建所选表的基架,并在单独的文件夹中创建具有指定名称和命名空间的上下文:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -ContextNamespace New.Namespace
以下示例使用配置读取连接字符串。
Scaffold-DbContext "Name=ConnectionStrings:Blogging" Microsoft.EntityFrameworkCore.SqlServer
Script-DbContext
从 DbContext 生成 SQL 脚本。 绕过任何迁移。
参数:
参数 | 说明 |
---|---|
-Output <String> |
要向其写入结果的文件。 |
上文中列出了通用参数。
Script-Migration
生成一个 SQL 脚本,该脚本将所有更改从一个选定的迁移应用到另一个选定的迁移。
参数:
参数 | 说明 |
---|---|
-From <String> |
初始迁移。 可以按名称或 ID 识别迁移。 数字 0 是一种特殊情况,表示首次迁移之前。 默认值为 0。 |
-To <String> |
结束迁移。 默认为上一次迁移。 |
-Idempotent |
生成可在任何迁移时用于数据库的脚本。 |
-NoTransactions |
不要生成 SQL 事务语句。 |
-Output <String> |
要向其写入结果的文件。 如果省略此参数,则使用创建应用运行时文件的同一文件夹中的生成名称创建文件,例如 /obj/Debug/netcoreapp2.1/ghbkztfz.sql/。 |
上文中列出了通用参数。
提示
To
、From
和 Output
参数支持 Tab 键扩展。
以下示例使用迁移名称为 InitialCreate 迁移(来自没有任何迁移的数据库)创建脚本。
Script-Migration 0 InitialCreate
以下示例使用迁移 ID 为 InitialCreate 迁移后的所有迁移创建脚本。
Script-Migration 20180904195021_InitialCreate
更新数据库
将数据库更新到上一次迁移或指定的迁移。
参数 | 说明 |
---|---|
-Migration <String> |
目标迁移。 可以按名称或 ID 识别迁移。 数字 0 是一种特殊情况,表示首次迁移之前并会还原所有迁移。 如果未指定迁移,该命令默认还原到上一次迁移。 |
-Connection <String> |
用于连接到数据库的连接字符串。 默认为 AddDbContext 或 OnConfiguring 中指定的值。 |
上文中列出了通用参数。
提示
Migration
参数支持 Tab 键扩展。
以下示例还原所有迁移。
Update-Database 0
下面的示例将数据库更新为指定的迁移。 第一个示例使用迁移名称,第二个示例使用迁移 ID 和指定的连接:
Update-Database InitialCreate
Update-Database 20180904195021_InitialCreate -Connection your_connection_string