反向工程是基于数据库架构搭建实体类型类和 DbContext 类基架的过程。微软官方提供了两种方式:
.NET 命令行接口 (CLI) 工具的 dotnet ef dbcontext scaffold 命令执行
使用 EF Core 包管理器控制台 (PMC) 工具的 Scaffold-DbContext 命令
如果使用的Visual Studio,那么可以选择PMC工具,否则只能用CLI工具。因为使用PMC容易出错,所以建议使用CLI工具的dotnet ef dbcontext scaffold 命令。
使用.NET 命令行接口 (CLI) 工具(推荐)
先在PowerShell里运行命令dotnet tool install --global dotnet-ef 全局安装dotnet ef工具。
微软文档说要通过Nuget安装Microsoft.EntityFrameworkCore.Design包,作者实测不需要安装也可以。
安装完dotnet ef工具后在需要生成实体类的目录里执行命令:
dotnet ef dbcontext scaffold "Server={数据库地址};Database={数据库名称};User={登录名};Password={密码};Encrypt=True;TrustServerCertificate=True;" Microsoft.EntityFrameworkCore.SqlServer
这样就会为你自动创建了。
这里要注意链接字符串里需要加上Encrypt=True;TrustServerCertificate=True;,否则可能会报错:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 -
证书链是由不受信任的颁发机构颁发的。)
使用EF Core 包管理器控制台 (PMC) 工具
需要通过Nuget包管理器安装下面的包:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design
然后打开PowerShell,执行命令:
Scaffold-DbContext 'Server={数据库地址};Database={数据库名称};User={登录名};Password={密码};' Microsoft.EntityFrameworkCore.SqlServer
如果有证书问题像上面一样加上Encrypt=True;TrustServerCertificate=True;。
这样就给你自动生成好了。
这里很多人会碰到报错:
Scaffold-DbContext : 无法将“Scaffold-DbContext”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1
如果报这个错建议还是使用第一种方法比较简单,而且不需要装什么包就可以了。
指定特定的表反向生成
.NET CLI命令
dotnet ef dbcontext scaffold ... --table Artist --table Album
(PMC) 工具命令
Scaffold-DbContext ... -Tables Artist, Album
对象和属性名称命名规则
默认情况下,表和列名已修正,以便更好地匹配类型和属性的 .NET 命名约定。 在 PMC 中指定 -UseDatabaseNames 开关或在 .NET Core CLI 中指定 --use-database-names 选项将禁用此行为,从而尽可能保留原始数据库名称。 无效的 .NET 标识符仍将被修正,而合成名称(如导航属性)仍将符合 .NET 命名约定。
使用Fluent API或数据注释
默认情况下,使用 Fluent API 配置实体类型。 指定 -DataAnnotations (PMC) 或 --data-annotations (.NET Core CLI) 以改为使用数据注释(如果可能)。
例如,使用 Fluent API 将会生成如下代码:
entity.Property(e => e.Title)
.IsRequired()
.HasMaxLength(160);
而使用数据注释则将生成如下代码:
[Required]
[StringLength(160)]public string Title { get; set; }
指定DbContext类的名称
默认情况下,DbContext 类名称将是后缀为 Context 的数据库名称。 若要指定不同名称,请在 PMC 中使用 -Context,在 .NET Core CLI 中使用 --context指定。
目录和命名空间
实体类和 DbContext 类将生成到运行命令行所在的目录中,并使用项目的默认命名空间。比如例子中我在Models文件夹下运行的命令,那么它会生成在Models文件夹下并使用BlazorBlog.Models作为命名空间。
当然可以自己定义目录和命名空间
.NET CLI命令
可使用 --output-dir 指定在其中为类搭建基架的目录,并且可使用 --context-dir 将 DbContext 类搭建到与实体类型类不同的目录中:
dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models
默认情况下,命名空间将是根命名空间加上项目根目录下任何子目录的名称。 但是,可使用 --namespace 覆盖所有输出类的命名空间。 还可使用 --context-namespace 仅覆盖 DbContext 类的命名空间:
dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace
(PMC) 工具命令
可使用 -OutputDir 指定在其中为类搭建基架的目录,并且可使用 -ContextDir 将 DbContext 类搭建到与实体类型类不同的目录中:
Scaffold-DbContext ... -ContextDir Data -OutputDir Models
默认情况下,命名空间将是根命名空间加上项目根目录下任何子目录的名称。 但是,可使用 -Namespace 覆盖所有输出类的命名空间。 还可使用 -ContextNamespace 仅覆盖 DbContext 类的命名空间。
Scaffold-DbContext ... -Namespace Your.Namespace -ContextNamespace Your.DbContext.Namespace
更新实体模型
对数据库进行更改后,可能需要更新 EF Core 模型以反映这些更改。 如果数据库更改很简单,只需手动对 EF Core 模型进行更改即可。 例如,重命名表或列、删除列或更新列的类型都是在代码中进行的微小更改。
但是,更重要的更改并不容易手动完成。 一种常见的工作流是使用 -Force (PMC) 或 --force (CLI) 再次从数据库对模型进行反向工程,以使用更新的模型覆盖现有模型。