采用Code First Approach开发的应用能否在维护时切换为Database First Approach?
Code First项目能否切换为Database First开发
核心结论
完全可以切换,不需要全程沿用最初选择的Code First模式。Entity Framework(包括EF6和EF Core)本身没有强制要求项目必须全程使用同一种数据开发模式,你可以根据迭代需求随时切换,甚至混用两种模式。
具体切换操作步骤
- 第一步:先把现有Code First的所有迁移全部执行到目标数据库,保证当前数据库结构和最新代码的实体定义完全一致,避免后续反向工程生成的实体和原有业务逻辑不兼容
- 第二步:根据你使用的EF版本执行反向工程,生成Database First所需的实体和上下文:
- 若使用EF Core:在包管理器控制台执行
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir 实体存放目录 -Namespace 对应命名空间;如果使用.NET CLI,对应执行dotnet ef dbcontext scaffold "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -o 实体存放目录 -n 对应命名空间即可 - 若使用EF6:在项目中新增「ADO.NET实体数据模型」,选择「EF设计器从数据库生成」选项,按照向导选择对应数据库连接,即可自动生成实体类和edmx模型文件
- 若使用EF Core:在包管理器控制台执行
- 第三步:注释掉原有Code First模式的DbContext服务注册逻辑,替换为新生成的Database First的DbContext注册,全量回归测试原有业务功能,确认所有逻辑运行正常后,就可以删除原有的Code First实体、迁移文件夹等相关文件。后续开发即可使用Database First模式:先修改数据库结构,再重新执行反向工程命令更新实体代码即可
注意事项
- 切换前一定要备份数据库和现有代码,避免反向工程生成的实体字段定义、关联关系和原有业务代码的预期不一致,导致业务故障
- 反向工程生成的实体默认是partial类,如果你原有实体有自定义的业务方法、数据注解,可以单独写到同名partial类中,避免每次重新生成实体时自定义逻辑被覆盖
- 你也可以选择不完全切换,两种模式混用:比如原有业务模块继续用Code First维护,新增业务模块单独创建Database First的DbContext对接同一个数据库,两者互不影响
内容的提问来源于stack exchange,提问作者Jass Sanghera
相关产品推荐
相关产品推荐

