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 建议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>();
}
}
Run Code Online (Sandbox Code Playgroud)
我必须做出一项改变。CSharpEntityTypeGenerator构造函数ICSharpHelper作为参数而不是ICSharpUtilities
这两个类是在Data汇编中,这不是启动项目。
在包管理器控制台,我再次执行了脚手架命令。但是我没有看到生成的实体具有基类。
脚手架框架如何知道使用我的自定义生成器?我正在添加生成器serviceCollection,但看起来代码永远不会被执行
我错过了什么吗?
我认为默认情况下这些选项应该作为 EF Scaffolding 工具的一部分提供。
但这是我的代码。我正在使用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);
}
}
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)
| 归档时间: |
|
| 查看次数: |
4297 次 |
| 最近记录: |