添加到vwMyView的MyColumn未被EF6 .edmx识别,如何处理?
解决EF6 EDMX未同步视图新列及存储过程结果集的问题
这种情况在EF6里其实挺常见的,算不上异常——EF的模型更新机制对视图、依赖其他对象的存储过程的结构变化敏感度不高,尤其是当存储过程用SELECT *返回结果时,很容易出现模型和数据库不同步的情况。下面是具体的解决步骤:
一、同步视图vwMyView的结构到EDMX
- 打开你的EDMX设计器,右键空白处选择更新模型从数据库。
- 在弹出的窗口中,切换到刷新选项卡,找到
vwMyView并勾选,点击完成。如果这次刷新没生效,试试更彻底的方法:- 先从EDMX设计器里删除
vwMyView对应的实体(右键实体->删除),同时确保模型浏览器里的视图也被移除。 - 再次执行更新模型从数据库,在添加选项卡中重新选中
vwMyView,完成添加。这样EF会重新读取视图的最新结构,新列MyColumn就会出现在vwMyView实体中。
- 先从EDMX设计器里删除
二、同步存储过程MySproc的结果集
因为你的存储过程用了SELECT vwMyView.*,EF第一次导入时会缓存当时的结果集结构,视图更新后不会自动同步。解决方法:
- 同样先从EDMX中删除
MySproc:在模型浏览器里找到该存储过程,右键删除,同时删除对应的MySproc_Result复杂类型(如果有的话)。 - 重新执行更新模型从数据库,在添加选项卡中选中
MySproc,点击完成。 - 接下来要重新配置函数导入:在模型浏览器里找到刚添加的
MySproc,右键选择添加函数导入,在弹出的窗口中点击获取列信息——这一步是关键,EF会重新执行存储过程获取最新的结果集,然后选择生成新的复杂类型(或覆盖旧的),确认后MySproc_Result就会包含MyColumn了。
额外提示
- 尽量避免在存储过程中用
SELECT *,明确指定返回列,这样后续列变更时,EF更新模型的成功率更高,也更容易排查问题。 - 如果不想删除重新添加,也可以手动编辑EDMX的XML文件(不推荐新手操作):找到对应视图的
EntityType节点和存储过程结果集的ComplexType节点,手动添加MyColumn的属性定义,但要注意数据类型和数据库保持一致。
内容的提问来源于stack exchange,提问作者user9393635
相关产品推荐
相关产品推荐

