Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core 带接口的Scaffold-EF核心实体_Entity Framework Core_Ef Core 2.2 - Fatal编程技术网

Entity framework core 带接口的Scaffold-EF核心实体

Entity framework core 带接口的Scaffold-EF核心实体,entity-framework-core,ef-core-2.2,Entity Framework Core,Ef Core 2.2,我正在使用从现有数据库创建实体和DBContext Scaffold-DbContext "Server=XXXXXX;Database=MyDB;User ID=xxxx;Password=xxxxxxx" Microsoft.EntityFrameworkCore.SqlServer -ContextDir .-OutputDir Entities -Force 这很有效。但是有没有办法用已知的接口构建所有的实体呢?所以我有接口IEntityBase,我希望所有实体都有这个接口 注 该问题

我正在使用从现有数据库创建实体和DBContext

Scaffold-DbContext "Server=XXXXXX;Database=MyDB;User ID=xxxx;Password=xxxxxxx" Microsoft.EntityFrameworkCore.SqlServer -ContextDir .-OutputDir Entities -Force
这很有效。但是有没有办法用已知的接口构建所有的实体呢?所以我有接口
IEntityBase
,我希望所有实体都有这个接口

注 该问题针对EF Core 2+和脚手架

更新1
因此,根据我创建的
csharpentytytypegenerator
IDesignTimeServices
接受的答案对EF Core>2无效。*因此我使用@Chris Peackok的建议

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>();
    }
}
公共类MyEntityTypeGenerator:CSharpEntityTypeGenerator
{
公共MyEntityTypeGenerator(ICSharpHelper cSharpHelper)
:base(cSharpHelper)
{
}
公共重写字符串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”;
返回代码.Replace(oldString,newString);
}
}
公共类MyDesignTimeServices:IDesignTimeServices
{
public void配置DesignTimeServices(IServiceCollection服务集合)
{
serviceCollection.AddSingleton();
}
}
我必须做一个改变
CSharpEntityTypeGenerator
构造函数将
ICSharpHelper
作为参数,而不是
ICSharpUtilities

这两个类位于非启动项目的
Data
assembly中

在PackageManager控制台,我再次执行scaffolding命令。但是,我看不到生成的实体具有基类

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

我遗漏了什么吗?

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

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

csharpentytypegenerator

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);
    }
}
默认情况下,脚手架生成与表名同名的类。在我们的例子中,表名是复数的,但我们希望类名是单数的。因此,您必须实现
Microsoft.EntityFrameworkCore.Design.IPluralizer
。我用的是公用事业。但是,请注意,我无法在.Net核心项目中使用Nuget添加
屈折因子。看起来它还不支持.NET内核。因此,我在我的项目中添加了

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
您需要在启动项目中添加此类。最初,我把这个类和其他类放在同一个项目中,但这不起作用。我在startup项目中移动了这个类(在我的例子中是ASP.NET核心项目),它成功了

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        // Start debugger
        System.Diagnostics.Debugger.Launch();
        serviceCollection.AddSingleton<ICSharpEntityTypeGenerator, MyEntityTypeGenerator>();
        serviceCollection.AddSingleton<IPluralizer, MyPluralizer>();
    }
}
公共类MyDesignTimeServices:IDesignTimeServices
{
public void配置DesignTimeServices(IServiceCollection服务集合)
{
//启动调试器
System.Diagnostics.Debugger.Launch();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
}
}

您可以使用EF Core电动工具和把手模板来实现这一点


@AdamVincent它不是重复的。我的问题与.NETCore有关,具体是使用EFCore工具搭建脚手架。至少它与您的linkedJust不同,您希望脚手架操作附加
:IEntityBase
在所有从db生成的类上?可能重复@AdamVincent是但.net.core使用EF core我已下载power tool,但它不支持添加现成的基类/接口。正如你提到的,我必须使用把手。我决定坚持C#方法:)。如果powertool只是提供一个文本框来输入基类或接口名,我将不得不使用它。对于更复杂的定制,可能会使用HandleBarsforInfo,在EFCore 3中对多元化进行了更改,只是我自己看看,但以下链接可能对人们有用-尤其是“您需要在启动项目中添加此类。最初,我把这个类和其他类放在同一个项目中,但这不起作用。我在startup项目中移动了这个类(在我的例子中是ASP.NET核心项目),它“也为我工作”