具有接口的支架 EF Core 实体

LP1*_*P13 5 entity-framework-core ef-core-2.2

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

Scaffold-DbContext "Server=XXXXXX;Database=MyDB;User ID=xxxx;Password=xxxxxxx" Microsoft.EntityFrameworkCore.SqlServer -ContextDir .-OutputDir Entities -Force
Run Code Online (Sandbox Code Playgroud)

这个工作。但是有什么方法可以搭建所有具有已知接口的实体吗?所以我有接口IEntityBase,我希望所有实体都有这个接口

注意此问题特定于 EF Core 2+ 和脚手架

更新 1
因此,根据我创建的SO 建议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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须做出一项改变。CSharpEntityTypeGenerator构造函数ICSharpHelper作为参数而不是ICSharpUtilities

这两个类是在Data汇编中,这不是启动项目。

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

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

我错过了什么吗?

LP1*_*P13 2

我认为默认情况下这些选项应该作为 EF Scaffolding 工具的一部分提供。

但这是我的代码。我正在使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,脚手架生成与表名称同名的类。在我们的例子中,表名是复数,但我们想要类名单数。所以你必须实施Microsoft.EntityFrameworkCore.Design.IPluralizer。我使用了充气机实用程序。但是,请注意,我无法Inflector在 .Net Core 项目中使用 Nuget 添加。看起来它还不支持.NET Core。所以我在我的项目中添加了单个代码文件。

IP复数器

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

    public string Singularize(string identifier)
    {
        return Inflector.Singularize(identifier) ?? identifier;
    }
}
Run Code Online (Sandbox Code Playgroud)

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)