关于C#:如何使用EntityFramework核心将实体单数化

How to singularize entities with EntityFramework core

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

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

请,需要帮助!谢谢


我找到了解决方法!

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

要实施这样的解决方案,必须将DesignTimeServiceDbContextWriterModelConfigurationRelationalScaffoldingModelFactory自定义类和Inflector类驻留在Startup类所在的启动项目中。使用程序包管理器控制台执行以下命令:

1
Install-Package Microsoft.EntityFrameworkCore.Design

1
Install-Package Microsoft.EntityFrameworkCore.Tools

在脚手架过程中,Entity Framework Design将在Startup项目中搜索实现IDesignTimeServices的任何类,并执行其代码。

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

1
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的新接口使此过程更简单,您可以在实现了Pluralize和Singularize方法的类中使用。

如果要在解决方案中使用此数据库,则必须安装相同的Microsoft.EntityFrameworkCore.Design,Microsoft.EntityFrameworkCore.Tools软件包,还需要Microsoft.EntityFrameworkCore.SqlServer。但是现在,实现IDesignTimeServices的类仅需要在其中实现IPluralizer的类一个简单的方法是:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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项目中要做的所有事情。希望对您有所帮助!