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会搜索实现IDesignTimeServices到Startup项目中的任何类,并执行其代码.
执行以下命令,使用包管理器控制台根据需要替换值,请记住,如果需要将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项目中所要做的.我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |