我正在使用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,我创建了CSharpEntityTypeGenerator
和IDesignTimeServices
,对于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
中添加生成器,但看起来代码从未执行
我想念什么吗?
答案 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.4
和Microsoft.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>();
}
}