【问题标题】:Scaffold EF Core entities with interface带有接口的脚手架 EF Core 实体
【发布时间】:2019-06-05 19:42:34
【问题描述】:

我正在使用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 添加生成器,但看起来代码永远不会被执行

我错过了什么吗?

【问题讨论】:

  • @AdamVincent 它不是重复的。我的问题与 .net 核心有关,并且特定于使用 EF Core 工具的脚手架。至少它和你链接的不一样
  • 为了清楚起见,您希望脚手架操作在从数据库生成的所有类上附加.. : IEntityBase
  • @AdamVincent 是,但是 .net.core 使用 EF Core

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


【解决方案1】:

您可以使用带有 Handlebars 模板的 EF Core Power Tools 来实现此目的。

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

【讨论】:

  • 我已经下载了电动工具,但它不支持添加开箱即用的基类/接口。正如你提到的,我必须使用把手。我决定坚持 C# 方法:)。如果它只是提供一个文本框来输入基类或接口名称,我将不得不使用电动工具。对于更复杂的定制可以使用把手
【解决方案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);
    }
}

默认情况下,脚手架会生成与表名同名的类。在我们的例子中,表名是 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>();
    }
}

【讨论】:

  • 有关信息,EFCore 3 中的复数形式发生了变化,我只是自己查看,但以下链接可能对人们有用 - github.com/dotnet/efcore/issues/17401
  • 特别是“你需要在启动项目中添加这个类。最初,我有这个类与其他类在同一个项目中,但那不起作用。我在启动项目中移动了这个类,(在我的ASP.NET Core 项目的案例)并且它工作“对我也有用
猜你喜欢
  • 1970-01-01
  • 2021-06-14
  • 2019-06-18
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2021-06-29
  • 2016-10-10
相关资源
最近更新 更多