Entity Framework Core - 自定义脚手架生成

11
在Entity Framework 6中,我们可以通过运行T4模板来添加脚手架使用的内容。

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。是否有任何方法可以自定义脚手架的输出?
2个回答

7

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

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+中另一种实现方法。


好的,我可以在ScaffoldingServiceCollectionExtensions.cs中看到它是如何工作的。 - user917170
EF Core 的一个目标是保持框架的开放性和可扩展性。在这里,你实际上使用了一个“后门”。我们承诺将通过支持模板(问题#4038)来更轻松地实现这一点。 - bricelam
这个有现成的了吗,有没有任何教程?我想让我的所有Poco数据库类都扩展基类。实际上,我认为我会为此创建一个新问题。 - Dživo Jelić

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

1
这种方法也将在 EF Core 1.0.2 中启用。 - bricelam
3
在 EF Core 2.0.0 中,这些类被称为 CSharpDbContextGeneratorCSharpEntityTypeGenerator - Jani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接