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/中所述。
要实施这样的解决方案,必须将
1 | Install-Package Microsoft.EntityFrameworkCore.Design |
和
1 | Install-Package Microsoft.EntityFrameworkCore.Tools |
在脚手架过程中,Entity Framework Design将在
使用包管理器控制台执行以下命令,根据需要替换值,请记住,如果需要将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项目中要做的所有事情。希望对您有所帮助!