entity framework核心自定义脚手架

我已经完成了我的SQLServer数据库的脚手架。 它会在指定的文件夹中创建POCO对象。 我想做的是它从我的基类扩展。 我也使用存储库模式,所以我需要在每个实体上都有Id密钥,我不想在每次重新扩展数据库时更改它。

脚手架模型示例

public partial class Food { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public double Price { get; set; } } 

预期结果:

 public partial class Food : EntityBase { public string Name { get; set; } public string Description { get; set; } public double Price { get; set; } } public class EntityBase : IEntityBase { public int Id { get; set; } } 

您可以使用DbContextWriter和EntityTypeWriter来自定义脚手架输出。

在较新版本的实体核心编写器中重命名:

  • DBContextWriter == >> CSharpDbContextGenerator
  • EntityTypeWriter == >> CSharpEntityTypeGenerator

编写一些自定义类型编写器,您可以覆盖所有内容,您将获得自己的代码生成器:

 //HERE YOU CAN CHANGE THE WAY TYPES ARE GENERATED AND YOU CAN ADD INTERFACE OR BASE CLASS AS PARENT. public class CustomEntitiyTypeWriter : EntityTypeWriter { public CustomEntitiyTypeWriter([NotNull] CSharpUtilities cSharpUtilities) : base(cSharpUtilities) { } // Write Code returns generated code for class and you can raplec it with your base class public override string WriteCode([NotNull] EntityConfiguration entityConfiguration) { var classStr = base.WriteCode(entityConfiguration); var defaultStr = "public partial class " + entityConfiguration.EntityType.Name; var baseStr = "public partial class " + entityConfiguration.EntityType.Name + " : EntityBase"; classStr = classStr.Replace(defaultStr, baseStr); return classStr; } } 

在设置中声明它:

 public static void ConfigureDesignTimeServices(IServiceCollection services) => services.AddSingleton(); 

然后使用scaffold db,您可以使用CustomDBContextWriter为DBContext执行相同操作。

目前,脚手架工具不支持您描述的场景。 没有选项可以自定义其输出,仅定义生成的文件的位置以及是否使用Fluent API或数据注释进行配置。

EF Core是Code First框架。 建议是,一旦从现有数据库中反向设计模型,就可以使用迁移来保持两者之间的同步。

话虽如此,我意识到根据如何在团队中分配责任,可能并非总是可行。 在这种情况下,您可能需要考虑在EF Core的GitHub存储库上打开请求此function的问题: https : //github.com/aspnet/EntityFramework 。

@Tornike Choladze的出色答案使我朝着正确的方向前进,但在最新版本的.Net Core(2.0>)中,就设置而言,这似乎有点不同。

自定义实体类型生成器:

 class MyEntityTypeGenerator : CSharpEntityTypeGenerator { public MyEntityTypeGenerator(ICSharpUtilities cSharpUtilities) : base(cSharpUtilities) { } 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); } } 

和设置,它由同一个程序 IDesignTimeServices的一个类组成,并实现IDesignTimeServices

 public class MyDesignTimeServices : IDesignTimeServices { public void ConfigureDesignTimeServices(IServiceCollection serviceCollection) { serviceCollection.AddSingleton(); } }