我在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了解详情。
6条答案
按热度按时间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
ckocjqey2#
您可以使用以下命令:
您之前有金块包裹:
but5z9lq3#
实体框架核心5.0的更新:表名称现在在搭建时自动使用复数形式。(至少在使用-Provider Microsoft.EntityFrameworkCore.SqlServer时)
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上失败。ftf50wuq5#
从RC1开始,EF7不支持复数化。EF7支架的这一限制和其他限制将在此处进行跟踪:https://github.com/aspnet/EntityFramework/issues/4038
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似乎解决了我的问题。希望这能帮助别人解决他们的问题。