You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:40:07