雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

Entity Framework Core反向工程DB First基于数据库生成DbContext和实体类

2024-07-05 37

反向工程是基于数据库架构搭建实体类型类和 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) 再次从数据库对模型进行反向工程,以使用更新的模型覆盖现有模型。

更新于:2个月前
赞一波!3

文章评论

全部评论