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
相关产品推荐
相关产品推荐

