非.NET Core项目中更新EDMX文件的具体操作流程
.NET Framework EF6 Database First 模式下 EDMX 更新完整流程(适配三项目结构)
以下流程完全匹配你当前使用的ASP.NET MVC + Core数据层 + SSDT数据库项目的架构,和你之前.NET Core项目里Scaffold-DbContext的数据库优先逻辑对齐,不会破坏现有UoW、仓储层的自定义实现。
前置准备:先通过Database项目完成结构变更并同步到开发库
不要直接在SSMS修改数据库后直接更新EDMX,否则会导致SSDT数据库项目的结构和实际库不一致,后续dacpac部署出问题:
- 打开Visual Studio中的Database项目,直接在项目内完成所有结构变更:新增/删除表、调整字段属性、添加约束、编写对应前置/后置部署脚本
- 右键Database项目选择「发布」,将修改后的结构发布到你本地开发用的SQL Server实例,确认发布无报错、脚本执行符合预期
- 若本次操作包含删表、删字段的变更,提前扫一遍Core项目里的业务代码,标记出引用了这些即将删除对象的位置,减少后续编译排错成本
核心操作:更新EDMX模型
这一步就是EF6对应.NET Core Scaffold-DbContext的内置功能,全程可视化操作:
- 先关闭所有打开的、由EDMX自动生成的实体类、DbContext类文件,避免文件被VS占用导致更新失败
- 在解决方案资源管理器的Core项目中找到后缀为
.edmx的模型文件,双击打开EF可视化设计器 - 右键设计器空白区域,选择菜单中的「从数据库更新模型」
- 在弹出的更新向导中按三个标签页核对变更:
- 「添加」标签页:会列出开发库中存在、但当前EDMX未映射的表、视图、存储过程,勾选本次需要新增映射的对象即可
- 「刷新」标签页:会列出已经在EDMX中存在映射、但数据库结构发生变更的对象,保持默认全选即可,向导会自动同步字段、类型、约束的变更
- 「删除」标签页:会列出数据库中已删除、但EDMX中还保留映射的对象,核对是本次需要移除的表/字段后保持勾选
- 点击「完成」,等待VS自动更新EDMX的三层结构(概念模型、存储模型、映射关系),同时同步生成对应的实体类代码、DbContext中的
DbSet属性定义
校验与排错
- 更新完成后先查看设计器界面是否有红色错误标记,若提示映射不匹配,先确认你连接的开发库是否已经成功发布了最新结构,90%的这类报错都是连了旧库导致的
- 打开自动生成的实体类,核对新增字段是否存在、删除字段是否已移除、字段类型和SQL类型映射正确(比如SQL的
nvarchar(max)对应C#的string、bit对应bool) - 注意:你之前通过partial类扩展的实体逻辑、UoW/仓储层的自定义代码不会被自动更新覆盖,只要检查有没有重名冲突即可
- 编译整个解决方案,逐一修复因为删表、删字段导致的引用错误。
高频踩坑提醒
- 不要手动编辑EDMX的XML源文件,也不要直接修改
.Designer.cs后缀的自动生成代码,所有自定义逻辑都写在独立的partial类文件中,否则下次更新模型时所有修改都会被覆盖- 如果需要给实体属性加数据注解、做特性配置,通过partial类搭配
[MetadataType]特性实现,不要直接改自动生成的属性- 全程连接本地/开发环境数据库操作,绝对不要直接连生产库更新EDMX,所有环境的数据库部署都通过Database项目生成的dacpac包完成
- 提交代码时必须同时提交Database项目的结构变更、Core项目中更新后的EDMX文件及对应自动生成的代码文件,避免团队其他成员拉取代码后出现模型和库结构不匹配的问题
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

