最近,我使用 VS2017 创建了一个 ASP.NET Core(多平台)项目和一个用于管理 SQL Server 数据库模型的类库。
实际上我们在生产服务器中有一个数据库,我需要使用 dotnet ef dbcontext scaffold [arguments] [options] ... 命令行生成类,但是我需要在创建 DbContext 类时将类名单数化。
拜托,需要帮助!谢谢
最佳答案
我找到了解决方案!
最好的解决方案是实现 IDesignTimeServices 接口(interface)并使用 inflector 工具,如 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
在 Scaffold 过程中,Entity Framework Design 会在 Startup
项目中搜索任何实现了 IDesignTimeServices
的类,并执行其代码。
使用包管理器控制台执行以下命令根据需要替换值,请记住,如果需要将数据库优先进程中的模型类存储到其他项目(例如类库)中,请先在 Visual Studio 包管理器中选择它控制台:
Scaffold-DbContext -provider Microsoft.EntityFrameworkCore.SqlServer -connection "<connection string here...>" -Context MyDbContext -OutputDir "folder path" -StartupProject MyMainProject -Force
就是这样,单数化和任何所需的定制都非常完美!
感谢评论中提供的帮助!
更新:
最近的 Entity Framework Core 2.0 版本改进了单数化/复数化过程,避免了 DbContextWriter、ModelConfiguration 和 RelationalScaffoldingModelFactory 实现的要求,通过一个名为 IPluralizer 的新接口(interface)使这个过程更简单,您可以在实现 Pluralize 和 Singularize 方法的类中使用该接口(interface).
Microsoft.EntityFrameworkCore.Design、Microsoft.EntityFrameworkCore.Tools 的相同包安装是必需的,如果您希望在您的解决方案中使用此 DataBase,还需要 Microsoft.EntityFrameworkCore.SqlServer,但现在实现 IDesignTimeServices 的类只需要在中实现 IPluralizer 的类一个简单的方法:
public class CustomDesignTimeService : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
=> serviceCollection.AddSingleton<IPluralizer, CustomPluralizer>();
}
最后,CustomPluralizer 只是使用了 Inflector 工具类方法:
public class CustomPluralizer : IPluralizer
{
public string Pluralize(string identifier)
{
return Inflector.Pluralize(identifier) ?? identifier;
}
public string Singularize(string identifier)
{
return Inflector.Singularize(identifier) ?? identifier;
}
}
如果您不想使用 Inflector 类,只需实现您自己的 Pluralize/Singularize 代码。
这就是我在新的 ASP.NET Core 2.0 项目中必须做的所有事情。希望对您有所帮助!
关于c# - 如何使用 EntityFramework 核心来单一化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149678/