簡體   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