繁体   English   中英

Scaffold-DbContext 生成错误的类型

[英]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 的新文件夹和一个配置文件。

CodeTemplates 文件夹的屏幕截图

现在,您可以通过更改模板和创建一些 Handlebars 帮助器来更简单地自定义生成的实体和 DbContext。

有关更多信息,请查看https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars#handlebars-helpers-and-transformers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM