Entity Framework 核心 - 自定义脚手架

Entity Framework Core - Customise Scaffolding

在 Entity Framework 6 中,我们可以添加脚手架使用的 T4 模板 运行

Install-Package EntityFramework.CodeTemplates.CSharp

但是在Entity Framework Core 中,脚手架系统似乎没有使用T4 模板,脚手架似乎也不能自定义。它似乎全部在 c# 类 中,例如。

https://github.com/aspnet/EntityFramework/blob/a508f37cf5a0246e9b92d05429153c3d817ad5ec/src/Microsoft.EntityFrameworkCore.Tools.Core/Scaffolding/Internal/EntityTypeWriter.cs

有什么方法可以自定义脚手架的输出吗?

有一个特殊的、尚未记录的挂钩来覆盖设计时服务:

class Startup
{
    public static void ConfigureDesignTimeServices(IServiceCollection services)
        => services.AddSingleton<EntityTypeWriter, MyEntityTypeWriter>();
}

然后实现您的自定义生成器。

class MyEntityTypeWriter : EntityTypeWriter
{
    public EntityTypeWriter(CSharpUtilities cSharpUtilities)
        : base(cSharpUtilities)
    {
    }

    // TODO: Override with custom implementation
}

更新: 请参阅 Yehuda Goldenberg 的回答以了解在 EF Core 1.0.2+ 中执行此操作的另一种方法。

在.Net Core 1.1中,覆盖设计时服务的方法是在启动程序集中实现IDesignTimeServices接口。例如:

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddSingleton<EntityTypeWriter, MyEntityTypeWriter>();
        serviceCollection.AddSingleton<DbContextWriter, MybContextWriter>();

    }
}

https://github.com/aspnet/EntityFramework/issues/5617