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

EF Core DbContext脚手架未触发OperationReportHandler事件如何修复?

Fixing Empty OperationReportHandler Lists in EF Core Scaffolding

我看了你的代码,问题出在服务注册的顺序和重复注册上,导致EF Core脚手架实际使用的不是你配置了自定义Handler的OperationReporter实例。下面是具体的修复步骤和解释:

1. 核心问题分析

你调用AddScaffolding(reporter)时,已经自动将传入的reporter注册为IOperationReporter的单例实例。但后面手动添加的AddSingleton<IOperationReporter, OperationReporter>()会覆盖这个注册,让脚手架使用一个全新的、没有绑定你的列表的OperationReporter——这就是为什么你的四个日志列表始终为空的原因。另外,OperationReportHandler不需要单独注册为服务,它已经被包含在你创建的OperationReporter实例中了。

2. 修正后的完整代码

var errorList = new List<string>();
var warningList = new List<string>();
var infoList = new List<string>();
var verboseList = new List<string>();

// 创建绑定了自定义日志回调的OperationReporter
var reporter = new OperationReporter(
    new OperationReportHandler(
        m => errorList.Add(m),
        m => warningList.Add(m),
        m => infoList.Add(m),
        m => verboseList.Add(m)));

var serviceCollection = new ServiceCollection()
    // 先添加Scaffolding服务,传入我们配置好的reporter
    // 这一步会自动将reporter注册为IOperationReporter的单例
    .AddScaffolding(reporter);

// 配置SqlServer设计时服务
IDesignTimeServices provider = new Microsoft.EntityFrameworkCore.Design.Internal.SqlServerDesignTimeServices();
provider.ConfigureDesignTimeServices(serviceCollection);

var serviceProvider = serviceCollection.BuildServiceProvider();
var generator = serviceProvider.GetService<IModelScaffolder>();

var filePaths = generator.Generate(
    Config.ConnectionString,
    Config.Tables,
    Config.Schemas,
    Config.ProjectPath,
    Config.OutputPath,
    Config.RootNamespace,
    Config.ContextName,
    false, //useDataAnnotations
    Config.OverwriteFiles,
    Config.UseDatabaseNames);

// 现在可以查看日志列表的内容了
Console.WriteLine($"捕获到的错误: {string.Join("\n", errorList)}");
Console.WriteLine($"捕获到的警告: {string.Join("\n", warningList)}");

3. 验证方法

为了快速确认修复有效,你可以故意传入一个无效的连接字符串,或者指定一个数据库中不存在的表名。此时脚手架会生成错误/警告日志,你就能看到对应的列表中出现内容了。

内容的提问来源于stack exchange,提问作者Cyrus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:53:46