Database First模式下数据库变更后如何更新Entity Framework Core模型无需全量覆写?
EF Core 5 Database First 非覆盖式更新模型方案
以下是可直接落地的4种方案,按需选择即可:
- 用部分类(Partial Class)隔离自定义修改
EF Core 脚手架默认生成的模型类都是partial类,不要直接修改自动生成的模型文件,把自定义业务逻辑、额外属性、配置都放到独立的partial类文件中即可。后续就算用--force参数全量更新模型,也只会覆盖自动生成的文件,你自行编写的partial类不会受到任何影响。注意:自定义partial类的命名空间必须和自动生成的模型类命名空间完全一致才能生效。
- 仅更新指定表/视图,不全量覆盖
脚手架命令支持通过--table参数指定只更新特定的表,未被指定的表对应的模型文件完全不会被修改,自然不会被覆盖。
包管理器控制台示例命令:
.NET CLI示例命令:Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer --table 待更新表名1 --table 待更新表名2 --context 你的上下文类名dotnet ef dbcontext scaffold "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer --table 待更新表名1 --table 待更新表名2 --context 你的上下文类名 - 用Fluent API替代模型上的注解配置
如果你之前是直接在自动生成的模型类上加数据注解做规则配置,建议把这部分配置迁移到DbContext的OnModelCreating方法中用Fluent API实现,或者单独拆成IEntityTypeConfiguration的实现类。这样就算模型文件被重新生成,你的配置逻辑也不会丢失。 - 自定义脚手架模板统一生成规则
如果有全局的自定义生成规则需求,可以自定义EF Core的脚手架模板,调整自动生成模型的规则,后续生成的模型会直接按照你设定的规则输出,不需要每次生成后手动修改,自然没有覆盖后要手动还原的问题。
如果确实需要直接修改自动生成的模型文件,且不想用上述方案,建议把自动生成的模型文件纳入版本控制,每次执行更新命令前先提交现有修改,更新后对比差异手动合并自定义修改即可。
内容的提问来源于stack exchange,提问作者Mohan Raju
相关产品推荐
相关产品推荐

