[英]Scaffold-DbContext generates wrong type
我有一个 .Net6 Web API 项目,其模型(首先是数据库)是通过 Oracle 数据库中的 Scaffold-DbContext 生成的。 Oracle 包含Number(4)
类型的列,这些列在 C# 模型中生成为byte
。 似乎这一代人查看了表格,发现值小于 256 并决定该byte
应该适合。 如果现在在表中输入超过 256 的数字,则查询失败。
在这种情况下,如何强制脚手架使用更大的类型?
在 .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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.