带有界面的脚手架EF核心实体

时间:2019-06-05 19:42:34

标签: entity-framework-core ef-core-2.2

我正在使用Entity Framework Core tools从现有数据库中创建实体和DBContext。

Scaffold-DbContext "Server=XXXXXX;Database=MyDB;User ID=xxxx;Password=xxxxxxx" Microsoft.EntityFrameworkCore.SqlServer -ContextDir .-OutputDir Entities -Force

此工作。但是,有什么方法可以用已知接口架设所有实体?所以我有接口IEntityBase,我希望所有实体都具有此接口

注意 这个问题专门针对EF Core 2+和脚手架

更新1
因此,根据SO Suggesion,我创建了CSharpEntityTypeGeneratorIDesignTimeServices,对于EF Core> 2. *,接受的答案无效。因此,我使用@Chris Peacock的建议

public class MyEntityTypeGenerator: CSharpEntityTypeGenerator
{
    public MyEntityTypeGenerator(ICSharpHelper cSharpHelper)
        : base(cSharpHelper)
    {
    }

    public override string WriteCode(IEntityType entityType, string @namespace, bool useDataAnnotations)
    {
        string code = base.WriteCode(entityType, @namespace, useDataAnnotations);

        var oldString = "public partial class " + entityType.Name;
        var newString = "public partial class " + entityType.Name + " : EntityBase";

        return code.Replace(oldString, newString);
    }
}


public class MyDesignTimeServices: IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddSingleton<ICSharpEntityTypeGenerator, MyEntityTypeGenerator>();
    }
}

我必须进行一次更改。 CSharpEntityTypeGenerator构造函数使用ICSharpHelper作为参数,而不是ICSharpUtilities

这两个类位于Data程序集中,这不是启动项目。

在程序包管理器控制台中,我再次执行了脚手架命令。但是我看不到生成的实体具有基类。

脚手架框架如何知道如何使用我的自定义生成器?我正在serviceCollection中添加生成器,但看起来代码从未执行

我想念什么吗?

2 个答案:

答案 0 :(得分:1)

您可以将EF Core Power Tools与Handlebars模板配合使用。

https://github.com/ErikEJ/EFCorePowerTools/wiki/Reverse-Engineering#customize-code-using-handlebars

答案 1 :(得分:0)

我认为默认情况下,这些选项应作为EF脚手架工具的一部分提供。

但这是我的代码。我正在使用Microsoft.EntityFrameworkCore.Design 2.2.4Microsoft.EntityFrameworkCore.SqlServer 2.2.4,根据我对.NET Core的经验,将来的版本可能会更改

CSharpEntityTypeGenerator

public class MyEntityTypeGenerator: CSharpEntityTypeGenerator
{
    public MyEntityTypeGenerator(ICSharpHelper cSharpUtilities)
        : base(cSharpUtilities)
    {
    }

    public override string WriteCode(IEntityType entityType, string @namespace, bool useDataAnnotations)
    {
        Console.WriteLine(entityType.Name);

        string code = base.WriteCode(entityType, @namespace, useDataAnnotations);

        var oldString = "public partial class " + entityType.Name;
        var newString = "public partial class " + entityType.Name + " : EntityBase";

        return code.Replace(oldString, newString);
    }
}

默认情况下,脚手架会生成与表名称同名的类。在我们的例子中,表名是Pluralize,但是我们想要类名Singularize。因此,您必须实现Microsoft.EntityFrameworkCore.Design.IPluralizer。我使用了Inflator实用程序。但是,请注意,我无法在.Net Core项目中使用Nuget添加Inflector。看起来它还不支持.NET Core。因此,我在项目中添加了the single code file

IPluralizer

public class MyPluralizer : IPluralizer
{
    public string Pluralize(string identifier)
    {
        return Inflector.Pluralize(identifier) ?? identifier;
    }

    public string Singularize(string identifier)
    {
        return Inflector.Singularize(identifier) ?? identifier;
    }
}

IDesignTimeServices
您需要在启动项目中添加此类。最初,我在与其他班级相同的项目中上过此班级,但这没用。我将此类移至启动项目中(在我的情况下为ASP.NET Core项目),并且可以正常工作

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        // Start debugger
        System.Diagnostics.Debugger.Launch();
        serviceCollection.AddSingleton<ICSharpEntityTypeGenerator, MyEntityTypeGenerator>();
        serviceCollection.AddSingleton<IPluralizer, MyPluralizer>();
    }
}