[英]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.