EF Database First模式下存储过程返回类型异常求助
解决EF Database First中存储过程返回类型为String而非预期模型的问题
我之前在使用EF Database First时也碰到过完全一样的情况——当存储过程只返回单个列的结果时,EF经常会默认把返回类型识别成string(或者对应的数据类型),而不是自动创建对应的复杂类型。给你几个亲测有效的解决方案:
方案1:手动创建复杂类型并修改函数导入返回类型
这是最直接的方法:
- 打开你的
Model1.edmx设计器,右键空白区域,选择添加 -> 复杂类型 - 给这个复杂类型命名为
PreLoadWorkflowType,然后添加一个名为WorkflowType的属性,数据类型选择和数据库中workflow_type匹配的类型(比如string,长度设置为对应的值,比如20) - 打开模型浏览器(如果没显示,可通过菜单视图 -> 其他窗口 -> 实体数据模型浏览器打开),找到函数导入节点下的
PreLoadWorkflowType - 右键它选择编辑,在弹出的窗口里把返回类型改成你刚才创建的
PreLoadWorkflowType,点击确定后保存EDMX - 最后重新生成你的项目,此时
Model1.Context里的方法就会生成你期望的ObjectResult<PreLoadWorkflowType>了
方案2:调整存储过程帮助EF识别返回结构
有时候EF对单列结果的存储过程识别不敏感,你可以稍微修改存储过程的查询语句,让EF能明确感知返回的是一个实体结构:
ALTER PROCEDURE [dbo].[PreLoadWorkflowType] AS BEGIN SET NOCOUNT ON; -- 显式指定列类型和别名,帮助EF识别 SELECT DISTINCT CAST(workflow_type AS VARCHAR(20)) AS WorkflowType FROM V_ui_View WHERE workflow_type IS NOT NULL END
修改完存储过程后,删除EDMX中已有的PreLoadWorkflowType存储过程和函数导入,重新导入这个存储过程,EF应该会自动创建对应的复杂类型,生成正确的返回类型代码。
方案3:手动编辑EDMX的XML(针对顽固情况)
如果前两种方法都没生效,可以直接修改EDMX的XML内容:
- 右键
Model1.edmx文件,选择打开方式 -> XML编辑器 - 首先找到
<ComplexTypes>节点,确保里面有定义好的PreLoadWorkflowType:<ComplexType Name="PreLoadWorkflowType"> <Property Name="WorkflowType" Type="String" MaxLength="20" Nullable="false" /> </ComplexType> - 然后找到
<FunctionImports>节点下对应的PreLoadWorkflowType,修改ReturnType属性为你的复杂类型的完整命名空间路径:<FunctionImport Name="PreLoadWorkflowType" ReturnType="Collection(YourProjectNamespace.PreLoadWorkflowType)" /> - 保存XML文件,重新生成项目,Context类的代码就会更新为预期的返回类型
补充说明
之前你没碰到这个问题,大概率是因为之前的存储过程返回多列结果,EF会自动创建对应的复杂类型;而这次是单列返回,EF默认映射成了列的原生数据类型(string),所以需要我们手动干预来指定返回的复杂类型。
内容的提问来源于stack exchange,提问作者UwakPeter
相关产品推荐
相关产品推荐

