实体框架核心 - 自定义脚手架

use*_*170 11 c# entity-framework-core

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

Install-Package EntityFramework.CodeTemplates.CSharp
Run Code Online (Sandbox Code Playgroud)

但是在Entity Framework Core中,脚手架系统似乎没有使用T4模板,看起来脚手架也不能定制.它似乎都在c#类中,例如.

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

有没有办法自定义脚手架的输出?

bri*_*lam 6

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

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

然后实现自定义生成器.

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

    // TODO: Override with custom implementation
}
Run Code Online (Sandbox Code Playgroud)

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


Yeh*_*erg 5

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/aspnet/EntityFramework/issues/5617

  • 在EF Core 2.0.0中,这些类被称为`CSharpDbContextGenerator`和`CSharpEntityTypeGenerator` (2认同)