EF Core 8:无需继承内部类,自定义DbContext与实体脚手架的方法?
EF Core 8 无需依赖内部类自定义数据库脚手架方案
之前依赖Microsoft.EntityFrameworkCore.Scaffolding.Internal内部类的自定义方案确实容易因版本迭代失效,EF Core 8已经提供了完全基于公开API的自定义方式,不用再碰内部类,具体方案如下:
一、基于公开接口自定义代码生成逻辑
EF Core 8将之前的内部生成器类移到了公开的Microsoft.EntityFrameworkCore.Scaffolding命名空间,你可以直接继承或实现以下公开类型:
1. 自定义实体类生成
- 直接继承公开的
CSharpEntityTypeGenerator,重写你需要定制的方法,比如WriteClassHeader(添加类注释)、WriteProperty(修改属性生成逻辑)、WriteNavigationProperty(调整导航属性)等。 - 也可以完全实现
IEntityTypeGenerator接口从零构建实体生成逻辑,但继承基类更高效,只需修改需要定制的部分。
2. 自定义DbContext生成
- 继承公开的
CSharpDbContextGenerator,重写WriteCode(调整DbContext整体结构)、WriteConstructor(添加自定义构造函数)、WriteDbSets(修改DbSet声明方式)等方法。 - 同样支持实现
IDbContextGenerator接口完全自定义。
3. 预调整脚手架模型
如果需要在生成代码前修改数据库映射的模型(比如修改实体名称、忽略特定字段、调整数据类型映射),可以继承RelationalScaffoldingModelFactory或实现IScaffoldingModelFactory接口,重写Create方法来修改模型元数据,后续代码生成会基于修改后的模型执行。
二、注册自定义生成器
创建一个实现IDesignTimeServices的类,在项目中注册你的自定义组件,脚手架工具会自动识别并使用:
public class CustomScaffoldingServices : IDesignTimeServices { public void ConfigureDesignTimeServices(IServiceCollection services) { // 替换实体生成器 services.Replace(ServiceDescriptor.Singleton<IEntityTypeGenerator, CustomEntityTypeGenerator>()); // 替换DbContext生成器 services.Replace(ServiceDescriptor.Singleton<IDbContextGenerator, CustomDbContextGenerator>()); // 若需自定义模型工厂,添加以下注册 services.Replace(ServiceDescriptor.Singleton<IScaffoldingModelFactory, CustomScaffoldingModelFactory>()); } }
三、示例:给实体类添加自定义注释
比如要给每个生成的实体类添加业务注释,只需继承CSharpEntityTypeGenerator并重写对应方法:
public class CustomEntityTypeGenerator : CSharpEntityTypeGenerator { public CustomEntityTypeGenerator(ICSharpHelper cSharpHelper) : base(cSharpHelper) { } protected override void WriteClassHeader(EntityType entityType, IndentedStringBuilder stringBuilder) { // 插入自定义XML注释 stringBuilder.AppendLine("/// <summary>"); stringBuilder.AppendLine($"/// 数据库表[{entityType.GetTableName()}]对应的实体类"); stringBuilder.AppendLine("/// </summary>"); // 调用基类方法生成默认头部 base.WriteClassHeader(entityType, stringBuilder); } }
这种基于公开API的方案完全遵循EF Core官方扩展规范,版本升级时兼容性更有保障,不用再因内部类变更频繁重构代码。
内容的提问来源于stack exchange,提问作者Bill Turner
相关产品推荐
相关产品推荐

