NET Core CLI 简介
NET Core CLI:命令行界面工具,我们可以使用这个命令行工具去实现基于现有数据库的数据迁移,数据模型生成和应用的迁移
命令是跨平台 dotnet 命令的扩展,它是 .NET Core SDK的一部分
安装工具
dotnet ef 可以安装为全局或本地工具
dotnet tool install --global dotnet-ef
使用以下命令更新工具
dotnet tool update --global dotnet-ef
验证安装:运行以下命令以验证是否正确安装了 EF Core CLI 工具
dotnet ef
使用工具
第一步我们需要创建一个解决方案,然后创建一个控制台程序,当然我们也可以创建web程序,看个人喜好,我习惯使用控制台程序进行测试
然后找到对应的文件夹路径
使用cmd命令打开命令行程序
首先验证CLI是否安装成功
如果没有出现这个画面,请检查是否进行过安装命令的执行
目标项目和启动项目
命令引用 项目 和 启动项目。
- 该 项目 也称为 目标项目 ,因为它是命令在其中添加或删除文件的位置。 默认情况下,当前目录中的项目是目标项目。 可以使用选项指定其他项目作为目标项目 --project 。
- 启动项目 是工具生成和运行的项目。 这些工具必须在设计时执行应用程序代码,以获取有关项目的信息,例如数据库连接字符串和模型的配置。 默认情况下,当前目录中的项目是启动项目。 您可以使用选项指定其他项目作为启动项目 --startup-project 。
启动项目和目标项目通常是同一个项目。 它们是不同的项目的典型方案是:
- EF Core 的上下文和实体类位于 .NET Core 类库中。
- .NET Core 控制台应用程序或 web 应用程序引用类库。
还可以 将迁移代码放在与 EF Core 上下文分离的类库中。
其他目标框架
CLI 工具适用于 .NET Core 项目和 .NET Framework 项目。 .NET Standard 类库中具有 EF Core 模型的应用可能没有 .NET Core 或 .NET Framework 项目。 例如,这适用于 Xamarin 和通用 Windows 平台应用。 在这种情况下,你可以创建一个仅供其使用的 .NET Core 控制台应用项目,作为工具的启动项目。 项目可以是不包含实际代码的虚拟项目, — 只需为工具提供目标。
为什么需要虚拟项目? 如前文所述,这些工具必须在设计时执行应用程序代码。 为此,需要使用 .NET Core 运行时。 当 EF Core 模型位于面向 .NET Core 或 .NET Framework 的项目中时,EF Core 工具会借用项目中的运行时。 如果 EF Core 模型在 .NET Standard 类库中,则无法执行此操作。 .NET Standard 不是实际的 .NET 实现;它是 .NET 实现所必须支持的一组 Api 的规范。 因此 .NET Standard 不足以执行应用程序代码 EF Core 工具。 你创建的用于启动项目的虚拟项目提供了一个具体的目标平台,工具可在其中加载 .NET Standard 类库。
常用选项
选项 | Short | 说明 |
--json | 显示 JSON 输出。 | |
--context <DBCONTEXT> | -c | 要使用的 DbContext 类。 仅命名空间或完全限定类名。 如果省略此选项,EF Core 将查找上下文类。 如果有多个上下文类,则需要此选项。 |
--project <PROJECT> | -p | 目标项目的项目文件夹的相对路径。 默认值为当前文件夹。 |
--startup-project <PROJECT> | -s | 启动项目的项目文件夹的相对路径。 默认值为当前文件夹。 |
--framework <FRAMEWORK> | 。 当项目文件指定多个目标框架,并想要选择其中一个时,请使用。 | |
--configuration <CONFIGURATION> | 生成配置,例如: Debug 或 Release 。 | |
--runtime <IDENTIFIER> | 要为其还原包的目标运行时的标识符。 有关运行时标识符 (RID) 的列表,请参阅 RID 目录 。 | |
--no-build | 不要生成项目。 应在生成是最新版本时使用。 | |
--help | -h | 显示帮助信息。 |
--verbose | -v | 显示详细输出。 |
--no-color | 不要为输出着色。 | |
--prefix-output | 用 level 作为输出前缀。 |
dotnet ef database drop---删除数据库。
选项:
选项 | Short | 说明 |
--force | -f | 不要确认。 |
--dry-run | 显示要删除的数据库,但不删除它。 |
dotnet ef database update --将数据库更新到上次迁移或指定迁移
参数 | 说明 |
<MIGRATION> | 目标迁移。 可以按名称或 ID 识别迁移。 数字0是一种特殊情况,表示在 第一次迁移之前 ,并导致还原所有迁移。 如果未指定迁移,则该命令默认为上一次迁移。 |
选项 | 说明 |
--connection <CONNECTION> | 用于连接到数据库的连接字符串。 默认为或中指定的 AddDbContext 一个 OnConfiguring 。 在 EF Core 5.0 中添加。 |
示例:
dotnet ef database update InitialCreate dotnet ef database update 20180904195021_InitialCreate --connection your_connection_string
第一行是针对迁移的名称进行修改数据库
第二行是指定迁移的Id和数据的连接字符串进行修改数据库
dotnet ef dbcontext info 获取数据库上下文的信息
dotnet ef dbcontext scaffold 为 DbContext 数据库的和实体类型生成代码,为了使此命令生成实体类型,数据库表必须具有主键。
参数 | 说明 |
<CONNECTION> | 用于连接到数据库的连接字符串。 对于 ASP.NET Core 2.x 项目,值可以是 name = <name of connection string>。 在这种情况下,该名称来自为项目设置的配置源。 |
<PROVIDER> | 要使用的提供程序。 通常,这是 NuGet 包的名称,例如: Microsoft.EntityFrameworkCore.SqlServer 。 |
选项 | Short | 说明 |
--data-annotations | -d | 使用属性可在可能) 的情况下配置模型 (。 如果省略此选项,则只使用 Fluent API。 |
--context <NAME> | -c | DbContext要生成的类的名称。 |
--context-dir <PATH> | 要放入 DbContext 类文件的目录。 路径相对于项目目录。 命名空间是从文件夹名称派生的。 | |
--context-namespace <NAMESPACE> | 要用于生成的类的命名空间 DbContext 。 注意:重写 --namespace 。 在 EF Core 5.0 中添加。 | |
--force | -f | 覆盖现有文件。 |
--output-dir <PATH> | -o | 要在其中放置实体类文件的目录。 路径相对于项目目录。 |
--namespace <NAMESPACE> | -n | 要用于所有生成的类的命名空间。 默认值为从根命名空间和输出目录生成。 在 EF Core 5.0 中添加。 |
--schema <SCHEMA_NAME>... | 要为其生成实体类型的表的架构。 若要指定多个架构,请重复上述操作 --schema 。 如果省略此选项,则包括所有架构。 | |
--table <TABLE_NAME>... | -t | 要为其生成实体类型的表。 若要指定多个表,请对 -t 每个表重复或 --table 。 如果省略此选项,则包括所有表。 |
--use-database-names | 使用表和列的名称与数据库中显示的名称完全相同。 如果省略此选项,则更改数据库名称以更严格地符合 c # 名称样式约定。 | |
--no-onconfiguring | 禁止 OnConfiguring 在生成的类中生成方法 DbContext 。 在 EF Core 5.0 中添加。 | |
--no-pluralize | 请勿使用复数化程序。 添加 EF Core 5。0 |
示例:将通过数据库连接生成模型并将所有生成的文件放到相对目录的文件夹下面
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
示例:设定指定的表,并在具有指定名称和命名空间的单独文件夹中创建上下文
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -t Blog -t Post --context-dir Context -c BlogContext --context-namespace New.Namespace
下面的示例使用 机密管理器工具从项目的配置集读取连接字符串。
dotnet user-secrets set ConnectionStrings:Blogging "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Blogging" dotnet ef dbcontext scaffold Name=ConnectionStrings:Blogging Microsoft.EntityFrameworkCore.SqlServer
下面的示例跳过方法的基架 OnConfiguring 。 如果要在类的外部配置 DbContext,这会很有用。 例如,ASP.NET Core 应用通常在 Startup.ConfigureServices 中对其进行配置。 在 EF Core 5.0 中添加。
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;User Id=myUsername;Password=myPassword;" Microsoft.EntityFrameworkCore.SqlServer --no-onconfiguring
dotnet ef dbcontext script 从 DbContext 生成 SQL 脚本。 绕过任何迁移。 在 EF Core 3.0 中添加。
选项 | Short | 说明 |
--output <FILE> | -o | 要向其写入结果的文件。 |
dotnet ef migrations add 添加新的迁移。
参数 | 说明 |
<NAME> | 迁移的名称。 |
选项 | Short | 说明 |
--output-dir <PATH> | -o | 用于输出文件的目录。 路径相对于目标项目目录。 默认值为 "迁移"。 |
--namespace <NAMESPACE> | -n | 要用于生成的类的命名空间。 默认为从输出目录生成。 在 EF Core 5.0 中添加。 |
dotnet ef migrations list 列出可用迁移
选项 | 说明 |
--connection <CONNECTION> | 用于连接到数据库的连接字符串。 默认值为 AddDbContext 或 OnConfiguring 中指定的值。 在 EF Core 5.0 中添加。 |
--no-connect | 请勿连接到数据库。 在 EF Core 5.0 中添加。 |
dotnet ef migrations remove 删除上一次迁移,回滚针对最新迁移所做的代码更改
选项 | Short | 说明 |
--force | -f | 还原最新迁移,回滚针对最新迁移所做的代码和数据库更改。 如果在连接到数据库时出现错误,则继续仅回滚代码更改。 |
dotnet ef migrations script 从迁移生成 SQL 脚本
参数 | 说明 |
<FROM> | 开始迁移。 可以按名称或 ID 识别迁移。 数字0是一个特殊情况,表示在 第一次迁移之前。 默认值为 0。 |
<TO> | 结束迁移。 默认为上次迁移。 |
选项 | Short | 说明 |
--output <FILE> | -o | 要写入脚本的文件。 |
--idempotent | -i | 生成可用于任何迁移的数据库的脚本。 |
--no-transactions | 不生成 SQL transaction 语句。 在 EF Core 5.0 中添加。 |
以下示例创建用于 InitialCreate 迁移的脚本
dotnet ef migrations script 0 InitialCreate
以下示例在 InitialCreate 迁移之后为所有迁移创建一个脚本
dotnet ef migrations script 20180904195021_InitialCreate