在 .NET 6 中,您可以使用 Handlebars 模板自定义生成的代码。为此,您需要安装 EntityFrameworkCore.Scaffolding.Handlebars NuGet 包,然后添加 Handlebars 转换器。
安装 NuGet 包后,您需要告诉dotnet ef db scaffold 命令使用模板。您可以通过将实现IDesignTimeServices 接口的类添加到您的项目来做到这一点。该接口只有一种方法可以实现,称为ConfigureDesignTimeServices。在那里您将注册 Handlebars 模板功能。
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.DependencyInjection;
namespace MyProject;
internal class MyDesignTimeService : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
{
serviceCollection.AddHandlebarsScaffolding();
}
}
现在您可以添加 HandlebarsTransformer 并更改生成的属性类型。
假设您只想为名为 MyFourDigitsColumn 的一列生成 int 而不是 byte。您可以通过添加以下转换器来做到这一点:
serviceCollection.AddHandlebarsTransformers(
propertyTransformer: p => p.PropertyName == "MyFourDigitsColumn"
? new EntityPropertyInfo("int", p.PropertyName, p.PropertyIsNullable)
: p);
如果您想对所有类型执行此操作,您可以将所有列的 byte 替换为 int,如下所示:
serviceCollection.AddHandlebarsTransformers(
propertyTransformer: p => p.PropertyType == "byte"
? new EntityPropertyInfo("int", p.PropertyName, p.PropertyIsNullable)
: p);
当您现在运行脚手架时,您会注意到在您的项目中创建了一个名为 CodeTemplates 的新文件夹和一个配置文件。
现在您可以通过更改模板和创建一些 Handlebars 助手来更简单地自定义生成的实体和 DbContext。
更多信息请查看https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars#handlebars-helpers-and-transformers