如何更新Entity Framework存储过程结果的自动生成代码?
解决EF自动生成类不更新存储过程结果的问题
嘿,我来帮你梳理下这个问题!你已经做了不少正确的操作,但EF4(你用的是EF运行时4.0.30319)搭配VS2013确实有一些容易踩的小坑,咱们一步步来排查:
1. 先确认EDMX里的Function Import是否真的同步了修改
- 打开EDMX设计视图,找到对应存储过程的Function Import,右键点击选择「属性」
- 重点检查:
- 返回类型是否和修改后的存储过程输出一致(比如新增/删除了字段、字段类型变了)
- 如果返回的是复杂类型,找到对应的复杂类型,查看它的字段是否完全匹配存储过程的输出结果
有时候更新模型向导不会自动更新复杂类型的结构,尤其是存储过程的输出字段有变化时,这时候旧的复杂类型会导致生成的类还是老样子
2. 清理项目缓存并重新生成
- 先执行「Build -> Clean Solution」清理旧的编译文件,避免残留的旧类干扰
- 再执行「Build -> Build Solution」重新生成整个项目
- 之后再右键EDMX下的TT文件(非上下文文件)选择「运行自定义工具」,或者用「Build -> 转换所有T4模板」
3. 手动删除旧的导入项,重新添加
如果上面的步骤没用,大概率是EDMX里的缓存问题,可以试试彻底重置:
- 在EDMX设计视图中,删除对应的Function Import
- 找到对应的复杂类型(如果存在),也一并删除
- 重新运行「从数据库更新模型」,在向导中选中修改后的存储过程,完成更新
- 再次运行TT模板生成类文件
4. 确认EF版本与TT模板的兼容性
你用的是EF4,VS2013默认的TT模板虽然支持EF4,但要确认:
- TT文件的「自定义工具」属性是
TextTemplatingFileGenerator(右键TT文件 → 属性 → 自定义工具) - 不要手动修改TT模板生成的类文件,否则下次运行模板时可能不会覆盖修改(EF自动生成的类都是由TT模板控制的,手动改了会导致后续更新失效)
关于SQL Server版本提示的补充
你提到的「检测到不兼容的SQL Server版本」确实是VS2013自带的SSDT版本过旧导致的,安装VS2013的最新SSDT版本就能解决这个问题,虽然它和EF类更新不直接相关,但解决后能避免数据库连接时的其他异常,建议优先处理。
如果以上所有步骤都试过还是没效果,那可能需要针对存储过程的具体修改手动调整复杂类型,但这种情况很少见——大部分时候按照上面的步骤就能让EF自动更新对应的类啦!
内容的提问来源于stack exchange,提问作者lardymonkey
相关产品推荐
相关产品推荐

