如何使用EntityFramework核心单一化实体

时间:2017-07-17 16:52:21

标签: c# entity-framework asp.net-core ef-database-first

最近我使用VS2017创建了一个ASP.NET Core(多平台)项目和一个用于管理SQL Server数据库模型的ClassLibrary。

实际上我们在生产服务器中有一个数据库,我需要使用dotnet ef dbcontext scaffold [arguments] [options] ...命令行生成类,但是我需要在创建DbContext类时单一化类名。

请,需要帮助!感谢

1 个答案:

答案 0 :(得分:7)

我找到了解决方案!

最佳解决方案是实现IDesignTimeServices接口并使用https://romiller.com/2017/02/10/ef-core-1-1-pluralization-in-reverse-engineer/中所述的变形工具。

要实施此类解决方案,DesignTimeServiceDbContextWriterModelConfigurationRelationalScaffoldingModelFactory自定义类和Inflector类必须位于启动项目{} { 1}}类位于。使用包管理器控制台执行以下命令:

Startup

Install-Package Microsoft.EntityFrameworkCore.Design 

在Scaffold过程中,Entity Framework Design会在Install-Package Microsoft.EntityFrameworkCore.Tools 项目中搜索实现IDesignTimeServices的任何类,并执行其代码。

执行以下命令,使用包管理器控制台根据需要替换值,请记住,如果需要将Database First流程中的模型类存储到其他项目(fe类库),请先在Visual Studio包管理器中选择它控制台:

Startup

所有这些,单一化和所需的任何定制都是完美的!

感谢您在评论中提供的帮助!

更新:

最近的实体框架Core 2.0版本改进了Singularization / Pluralization过程,避免了对DbContextWriter,ModelConfiguration和RelationalScaffoldingModelFactory实现的要求,通过名为IPluralizer的新接口使这个过程更简单,您在实现Plurals和Singularize方法的类中使用

需要安装Microsoft.EntityFrameworkCore.Design,Microsoft.EntityFrameworkCore.Tools的相同软件包,如果您希望在解决方案中使用此DataBase,还需要Microsoft.EntityFrameworkCore.SqlServer,但现在实现IDesignTimeServices的类只需要实现IPluralizer的类一个简单的方式:

Scaffold-DbContext -provider Microsoft.EntityFrameworkCore.SqlServer -connection "<connection string here...>" -Context MyDbContext -OutputDir "folder path" -StartupProject MyMainProject -Force

最后,CustomPluralizer只使用Inflector工具类方法:

public class CustomDesignTimeService : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
                => serviceCollection.AddSingleton<IPluralizer, CustomPluralizer>();
}

如果您不想使用Inflector类,只需实现自己的Pluralize / Singularize代码即可。

这就是我在新的ASP.NET Core 2.0项目中所做的一切。我希望这有帮助!