EF6中如何从无匹配实体的存储过程获取自定义表值?
EF6 处理存储过程返回多表数据的正确操作步骤
重新导入存储过程并生成匹配的复杂类型
- 打开EDMX设计器,右键空白区域选择从数据库更新模型,勾选目标存储过程
MyStoredProc完成更新。 - 在EDMX中找到刚导入的
MyStoredProc,右键选择添加函数导入,点击返回类型区域的获取列信息,EF会自动读取存储过程返回的所有列结构。 - 点击创建新复杂类型,命名为
MyComplexType,确认后保存EDMX文件。
- 打开EDMX设计器,右键空白区域选择从数据库更新模型,勾选目标存储过程
代码中调用存储过程获取数据
复杂类型不会像实体那样直接出现在dbContext的属性集合里,需要通过函数导入生成的方法调用:var queryResults = dbContext.MyStoredProc().ToList();这里的
MyStoredProc()就是你添加函数导入时自动生成的方法,返回结果就是MyComplexType的集合。解释实体无法选中的原因
你手动添加的MyResult实体无法在函数导入中被选中,是因为EF要求实体必须与单一数据库表映射,且列名、数据类型要完全匹配。而你的存储过程返回多表联合数据,没有对应的单一表实体,因此复杂类型才是这类场景的正确选择,无需强行用实体匹配。收尾验证
保存EDMX后清理并重新生成项目,确保无编译错误。可以先在数据库中执行MyStoredProc,确认返回列与MyComplexType的属性完全一致,避免因列名或类型不匹配导致异常。
内容的提问来源于stack exchange,提问作者wizard
相关产品推荐
相关产品推荐

