SQL Server 如何在实体框架核心中构建具有多个DbSet属性名称的DbContext?

blmhpbnm  于 2023-01-20  发布在  其他
关注(0)|答案(6)|浏览(115)

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

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等)。除了网络搜索,我检查了命令语法:

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 scaffolding复数化现在可以在实体框架核心1.1中实现,请阅读下面的answer了解详情。

pprl5pva

pprl5pva1#

简短回答

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**答案的注解中所指出的,EF Core中的复数化可以使用一个名为Bricelam.EntityFrameworkCore.Pluralizer的包来实现,该包可以使用
在软件包管理器控制台(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
See More About Bricelam's Pluralizer

ckocjqey

ckocjqey2#

您可以使用以下命令:

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

您之前有金块包裹:

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

but5z9lq3#

实体框架核心5.0的更新:表名称现在在搭建时自动使用复数形式。(至少在使用-Provider Microsoft.EntityFrameworkCore.SqlServer时)

xu3bshqb

xu3bshqb4#

在EF Core 1.1中可以实现复数化。作为Rowan米勒described in its blog,您需要安装偏转器并实现IDesignTimeServices以在搭建时控制复数化。但是,请注意:
我们将这些服务放入 *.internal命名空间中,并保留在任何时候中断API的权利。
所以这就是为什么完整的代码示例没有复制到这里。这个答案不被接受的原因是一样的-我更喜欢等到我们得到一个稳定的API。
您应该考虑的另一个问题是-此解决方案依赖于提供程序。它与SQL Server配合良好(我测试过)。另一个DBMS提供程序可能还不支持此API。例如,当使用自定义IDesignTimeServices时,最新的Npgsql.EntityFrameworkCore.PostgreSQL 1.1.0在scaffold上失败。

ftf50wuq

ftf50wuq5#

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

w1jd8yoj

w1jd8yoj6#

我可能迟到了,但是在从.net core 3. 1升级到.net 6之后,当我使用了下面的命令:dbcontext支架“服务器=(本地);数据库=XXXXXX;可信连接=真;“Microsoft.EntityFrameworkCore.SqlServer -o Models\Entities -c DBContext -f --verbose --no-onconfiguring --startup-project../XXXX^它通过生成单数形式的实体来复制我的实体。在升级de命令之前,它一直从实体的数据库中为我提供名称,因此它不会添加重复的单数形式。我发现使用--no-复数化选项阻止了命令生成另一个单数形式的实体。我知道他们在net core 5中添加了默认复数化器,但我不知道为什么这会阻止单数化。所以Cris Loli的aswer似乎解决了我的问题。希望这能帮助别人解决他们的问题。

相关问题