EF7中Scaffold-DbContext生成的OnConfiguring缺失IsConfigured检查的优化方案问询
从EF6迁移至EF7,使用Scaffold-DbContext命令重建实体类时,发现生成的DbContext中OnConfiguring方法实现存在差异:
EF6版本实现:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. optionsBuilder.UseNpgsql("..."); } }
EF7版本实现:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. optionsBuilder.UseNpgsql("..."); }
当前使用的包版本:
- Microsoft.EntityFrameworkCore 7.0.1
- Microsoft.EntityFrameworkCore.PostgreSQL 7.0.1
- Microsoft.EntityFrameworkCore.Tools 7.0.1
EF7生成的代码缺失了if (!optionsBuilder.IsConfigured)检查,每次重建都要手动添加,十分繁琐。目前临时通过继承自动生成的DbContext并重写空的OnConfiguring方法规避,但该方案不合理,希望找到更优解,例如让Scaffold-DbContext不生成OnConfiguring方法。
1. 使用Name=语法读取连接字符串
执行Scaffold-DbContext时,用配置文件中的连接字符串名称代替硬编码的连接字符串,命令示例:
Scaffold-DbContext "Name=YourConnectionStringName" Npgsql.EntityFrameworkCore.PostgreSQL
这种方式下,脚手架不会在OnConfiguring中写入硬编码的连接字符串,而是生成从配置读取的逻辑,同时会自动保留if (!optionsBuilder.IsConfigured)检查,也避免了敏感信息暴露在代码中。
2. 使用--no-onconfiguring参数
EF Core 7及以上版本的Scaffold-DbContext命令支持--no-onconfiguring参数,执行时添加该参数可直接跳过OnConfiguring方法的生成:
Scaffold-DbContext "YourConnectionString" Npgsql.EntityFrameworkCore.PostgreSQL --no-onconfiguring
之后可手动在自定义的DbContext子类中实现配置逻辑,或者在启动时通过依赖注入配置DbContextOptions。
3. 升级EF Core版本
EF Core 7.0.1之后的部分版本修复了脚手架生成代码的该问题,尝试升级到7.x系列的最新稳定版,重新执行脚手架命令,可能会自动生成带if (!optionsBuilder.IsConfigured)检查的OnConfiguring方法。
4. 使用自定义脚手架模板
如果以上方法不满足需求,可以创建自定义的DbContext模板,修改模板中的OnConfiguring方法生成逻辑,添加if (!optionsBuilder.IsConfigured)检查。具体可通过dotnet new install安装自定义模板包,或者手动修改本地模板文件。
内容的提问来源于stack exchange,提问作者Starnuto di topo

