【问题标题】:Scaffold-DbContext generates wrong typeScaffold-DbContext 生成错误的类型
【发布时间】:2022-06-21 19:05:05
【问题描述】:

我有一个 .Net6 Web API 项目,其模型(首先是数据库)是通过 Scaffold-DbContext 从 Oracle 数据库生成的。 Oracle 包含 Number(4) 类型的列,这些列在 C# 模型中生成为 byte。似乎这一代人查看了表格,发现值小于 256,并决定 byte 应该适合。如果现在在表中输入超过 256 的数字,则查询失败。

在这种情况下如何强制脚手架使用更大的类型?

【问题讨论】:

    标签: c# oracle entity-framework .net-6.0 scaffolding


    【解决方案1】:

    在 .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

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 2022-11-17
      • 2018-03-06
      相关资源
      最近更新 更多