最近,我创建了一个 ASP.NET 核心(多平台(项目和一个类库,用于使用 VS2017 管理 SQL Server 数据库模型。
实际上我们在生产服务器中有一个数据库,我需要使用 dotnet ef dbcontext 脚手架 [参数] [选项] 生成类......命令行,但是我需要在创建 DbContext 类时将类名单数化。
拜托,需要帮助!谢谢
我已经找到了解决方案!
最好的解决方案是实现 IDesignTimeServices 接口并使用变形器工具,如 https://romiller.com/2017/02/10/ef-core-1-1-pluralization-in-reverse-engineer/中所述。
要实施此类解决方案,DesignTimeService
、DbContextWriter
、ModelConfiguration
、RelationalScaffoldingModelFactory
自定义类和Inflector
类必须驻留在类所在的启动项目中Startup
。使用包管理器控制台执行以下命令:
Install-Package Microsoft.EntityFrameworkCore.Design
和
Install-Package Microsoft.EntityFrameworkCore.Tools
在基架过程中,实体框架设计搜索在项目中实现IDesignTimeServices
的任何类Startup
并执行其代码。
使用包管理器控制台根据需要执行以下命令替换值,请记住,如果需要将数据库优先进程中的模型类存储到其他项目(例如类库(中,请先在 Visual Studio 包管理器控制台中选择它:
Scaffold-DbContext -provider Microsoft.EntityFrameworkCore.SqlServer -connection "<connection string here...>" -Context MyDbContext -OutputDir "folder path" -StartupProject MyMainProject -Force
仅此而已,单一化和所需的任何自定义都可以完美地工作!
感谢您在评论中提供的帮助!
更新:
最近的实体框架核心 2.0 版本改进了奇异化/复数化过程,避免了 DbContextWriter、ModelConfiguration 和 RelationalScaffoldingModelFactory 实现的要求,通过一个名为 IPluralizer 的新接口使此过程更简单,该接口在实现方法复数和单数化的类中使用。
Microsoft.EntityFrameworkCore.Design、Microsoft.EntityFrameworkCore.Tools 的相同包安装是必需的,如果您希望在解决方案中使用此数据库,还需要Microsoft.EntityFrameworkCore.SqlServer,但现在实现 IDesignTimeServices 的类只需要该类以简单的方式实现 IPluralizer,如下所示:
public class CustomDesignTimeService : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
=> serviceCollection.AddSingleton<IPluralizer, CustomPluralizer>();
}
最后,CustomPluralizer 仅使用变形器工具类方法:
public class CustomPluralizer : IPluralizer
{
public string Pluralize(string identifier)
{
return Inflector.Pluralize(identifier) ?? identifier;
}
public string Singularize(string identifier)
{
return Inflector.Singularize(identifier) ?? identifier;
}
}
如果你不想使用变形器类,只需实现你自己的复数/单数化代码。
这就是我在新的 ASP.NET Core 2.0项目中必须做的所有事情。我希望这有帮助!