Visual Studio 2022中无法从数据库更新Entity Framework Edmx
问题重现
在Visual Studio 2022(17.7.4/17.7.5版本)中,使用Entity Framework的EDMX文件执行「从数据库更新模型...」操作时,选择新增的数据表后出现以下错误:
Unable to generate the model because of the following exception: 'System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
[完整堆栈跟踪省略]
用户未手动设置任何查询计划提示,尝试手动添加实体但映射失败,目前已手动添加表和实体待测试。
解决方案
1. 排查目标表的结构问题
- 检查表是否存在复杂索引、嵌套触发器、计算列,或循环依赖的外键约束——这些结构会让EF自动生成的元数据查询在携带内部提示后无法被SQL Server解析
- 确认表已正确设置主键,无主键的表会导致EF反向工程逻辑异常
2. 修改EDMX XML禁用EF内部查询提示
- 右键EDMX文件,选择「打开方式」→「XML编辑器」
- 找到根节点
<Schema>,添加属性UseLegacyProvider="true",示例:<Schema Namespace="YourModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="15" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl" UseLegacyProvider="true"> - 保存后重新执行「从数据库更新模型」操作
3. 改用EF Power Tools工具
- 安装Visual Studio扩展「EF Power Tools」,它的反向工程逻辑不依赖EF默认的元数据查询提示,能更稳定地将数据库表同步到EDMX
4. 修正手动添加实体的映射
如果已手动添加实体,可通过以下步骤修复映射:
- 打开EDMX设计界面,右键目标实体→「表映射」
- 确保实体属性与数据库表列一一对应,主键必须匹配
- 若使用T4模板生成实体类,检查生成的代码是否带有正确的
[Table("TableName")]和[Column("ColumnName")]特性
测试建议
针对已手动添加的实体,优先测试基础CRUD操作,验证实体与数据库表的映射是否正确;若出现查询异常,重点检查导航属性、外键约束的匹配情况。
内容的提问来源于stack exchange,提问作者Ahmed Samy Moursi Hashwa

