繁体   English   中英

如何在 Entity Framework Core 中使用复数 DbSet 属性名称搭建 DbContext?

[英]How to scaffold DbContext with plural DbSet property names in Entity Framework Core?

我在Package Manager Console中使用Scaffold-DbContext命令为现有的 SQL 服务器数据库创建和重新创建上下文和实体:

Scaffold-DbContext -provider EntityFramework.MicrosoftSqlServer -connection "my connection string"

它完美地工作,除了一件事: DbSet的属性名称为单数形式:

public partial class MyDbContext : DbContext
{
    public virtual DbSet<Request> Request { get; set; }
    public virtual DbSet<RequestHeader> RequestHeader { get; set; }
}

我更喜欢这些名称是复数形式( Requests等)。 除了 web 搜索,我还检查了命令语法:

get-Help Scaffold-DbContext -detailed

并没有发现任何改变这种行为的方法。 这是我的packages.config

<packages>
  <package id="EntityFramework.Commands" version="7.0.0-rc1-final" targetFramework="net46" />
  <package id="EntityFramework.Core" version="7.0.0-rc1-final" targetFramework="net46" />
  ...
</packages>

搭建脚手架时如何使DbSet名称复数化?

更新 2017-04: DB First 脚手架多元化现在可以在 Entity Framework Core 1.1 中实现。 阅读下面我的答案以了解详细信息。

简答

1.安装包

Install-Package Bricelam.EntityFrameworkCore.Pluralizer

2.运行Scaffold-DbContext命令

Scaffold-DbContext -Connection "Server=<server>;Database=<dbname>;user id=<userid>;password=<pwd>;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/EFModels/


长答案:

正如@KalinKrastev@natemcmaster的回答的评论中指出的那样。 可以使用名为Bricelam.EntityFrameworkCore.Pluralizer的包在 EF Core 中进行复数化,该包可以使用

在包管理器控制台 (PMC) 或

dotnet add package Bricelam.EntityFrameworkCore.Pluralizer

使用 Dotnet cli。

安装包后,只需使用常规的Scaffold-DbContext命令。

Scaffold-DbContext -Connection "Server=<server>;Database=<dbname>;user id=<userid>;password=<pwd>;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/EFModels/ -Force

查看更多关于 Bricelam 的多元器

你可以使用这个命令:

Scaffold-DbContext "connectionString" Microsoft.EntityFrameworkCore.SqlServer -o Models -UseDatabaseNames -NoPluralize -force

你之前有 nuget 包:

Microsoft.EntityFrameworkCore.Design - version 5
Microsoft.EntityFrameworkCore - version 5
Microsoft.EntityFrameworkCore.SqlServer -version 5
Microsoft.EntityFrameworkCore.Tools - version 5
Microsoft.EntityFrameworkCore.Relational -version 5

EntityFrameworkCore 5.0的更新:TableNames 现在在脚手架上自动复数化。 (至少使用 -Provider Microsoft.EntityFrameworkCore.SqlServer)

复数化在 EF Core 1.1 中是可能的。 正如 Rowan Miller 在其博客中所描述的,您需要安装 Inflector 并实施IDesignTimeServices以在脚手架时控制复数化。 但是,请注意:

我们将这些服务放入 *.internal 命名空间,并保留随时破坏 API 的权利。

所以这就是为什么没有将完整的代码示例复制到此处的原因。 出于同样的原因,这个答案不被接受——我宁愿等到我们得到一个稳定的 API。

另一个你应该考虑的问题——这个解决方案依赖于提供者。 它适用于 SQL Server(我测试过)。 另一个 DBMS 供应商可能还不支持这个 API。 例如,当使用自定义IDesignTimeServices时,最新的 Npgsql.EntityFrameworkCore.PostgreSQL 1.1.0 在脚手架上失败。

从 RC1 开始,EF7 不支持复数化。 此处跟踪了 EF7 脚手架的这一限制和其他限制: https ://github.com/aspnet/EntityFramework/issues/4038

我可能迟到了,但在从 .net 核心 3.1 升级到 .net 6 之后,当我使用以下命令时:dbcontext scaffold "Server=(local);Database=XXXXXX;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models\Entities -c DBContext -f --verbose --no-onconfiguring --startup-project../XXXX^ 它通过生成它们的单一形式复制了我的实体。 直到 upgrade de 命令从实体数据库中给我名称,所以它没有添加重复的单数形式。 我发现使用 --no-pluralize 选项可以防止命令生成另一个具有单数形式的实体。 我知道他们在 .net core 5 中添加了一个默认的复数形式,但我不知道为什么这会阻止单数化。 所以 Cris Loli 的回答似乎解决了我的问题。 希望这可以帮助某人解决他们的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM