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

Ald*_*jal 1 c# entity-framework ef-database-first asp.net-core

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

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

请,需要帮助!谢谢

Ald*_*jal 10

我找到了解决方案!

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

要付诸于行动这样的解决方案,DesignTimeService,DbContextWriter,ModelConfiguration,RelationalScaffoldingModelFactory自定义类和Inflector类必须驻留在启动项目Startup类的位置.使用包管理器控制台执行以下命令:

Install-Package Microsoft.EntityFrameworkCore.Design 
Run Code Online (Sandbox Code Playgroud)

Install-Package Microsoft.EntityFrameworkCore.Tools
Run Code Online (Sandbox Code Playgroud)

在Scaffold过程中,Entity Framework Design会搜索实现IDesignTimeServicesStartup项目中的任何类,并执行其代码.

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

Scaffold-DbContext -provider Microsoft.EntityFrameworkCore.SqlServer -connection "<connection string here...>" -Context MyDbContext -OutputDir "folder path" -StartupProject MyMainProject -Force
Run Code Online (Sandbox Code Playgroud)

总而言之,单一化和任何需要的定制都是完美的!

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

更新:

最近的Entity Framework Core 2.0版本改进了Singularization/Pluralization过程,避免了对DbContextWriter,ModelConfiguration和RelationalScaffoldingModelFactory实现的要求,通过名为IPluralizer的新接口使您的过程更加简单,您在实现Pluralize和Singularize方法的类中使用它.

需要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>();
}
Run Code Online (Sandbox Code Playgroud)

最后,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该是实体框架核心的默认行为,或者至少是Scaffold-DbContext命令(`-pluralize`?)上的一个选项。 (3认同)
  • 如果您使用 efcore &gt;= 3 并且无法找到 IPluralizer,请查看:/sf/ask/4079355381/ (2认同)