如何拆分EntityFramework 5过长的scaffold命令并实现DbContext实体追加
关于Database First模式拆分Scaffold命令追加实体的问题
你提到的「第一条命令加-force参数、后续省略-force实现向现有DbContext追加内容」的方案不可行。
核心原因
- 无论是包管理控制台的
Scaffold-DbContext命令,还是.NET CLI的dotnet ef dbcontext scaffold命令,默认逻辑都是全量生成:每次执行都会根据本次指定的表列表生成完整的DbContext和对应实体文件,不存在内置的增量追加逻辑。 - 省略
-force参数的情况下,只要命令检测到目标路径下存在同名的DbContext、实体类文件,就会直接报错终止,不会自动合并内容。就算你提前删除了本次要新增的表对应的实体文件,命令生成的新DbContext也只会包含本次指定的表,之前生成的DbSet、表配置都会被直接覆盖,原有内容会丢失。
可行解决方案
方案1:使用响应文件规避命令长度限制(最推荐)
不需要拆分命令,直接从根源解决命令过长的问题:
- 新建后缀为
.rsp的响应文件,比如命名为scaffold.rsp,把所有命令参数、要生成的表名全部写入文件内,无需考虑长度限制,示例内容如下:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir EntityModels -ContextDir DbContext -Context MyAppDbContext -Tables Table1,Table2,Table3,Table4,Table5,Table6 # 此处填写所有需要生成的表名 -Force
- 打开包管理控制台,执行
@scaffold.rsp即可一次性完成所有表的生成。如果使用.NET CLI,调整rsp文件内的命令为CLI格式后,执行dotnet ef @scaffold.rsp即可。
方案2:手动增量生成
如果确实有拆分多次生成的需求,可按以下步骤操作:
- 第一次执行带
-Force参数的scaffold命令,生成第一批表的实体和DbContext,完成后提交所有生成文件到版本控制,方便后续对比修改。 - 第二次执行scaffold命令时,指定临时的输出目录和临时DbContext名,比如添加参数
-OutputDir TempModels -Context TempDbContext,生成第二批需要新增的表。 - 将临时目录下新增的实体类移动到正式的实体存放目录。
- 对比临时DbContext和正式DbContext的内容,把新增的DbSet属性、
OnModelCreating方法内的表配置代码,复制到正式DbContext的对应位置。 - 删除临时目录下所有生成的文件即可。
内容的提问来源于stack exchange,提问作者Intensivist
相关产品推荐
相关产品推荐

