实体框架 - 具有多个结果集的存储过程 - 没有行返回

Posted

技术标签:

【中文标题】实体框架 - 具有多个结果集的存储过程 - 没有行返回【英文标题】:Entity Framework - Stored Procedure with Multiple results sets - no rows return 【发布时间】:2014-08-06 16:48:58 【问题描述】:

所以,我试图在实体框架中实现具有多个结果集的存储过程。 这一切似乎太容易了。 但是,我的结果集没有得到任何行(尽管,我似乎确实得到了结果集本身)。

我做了什么:

    创建了返回3个结果集的存储过程 创建了表示返回值的复杂类型 按照Stored Procedures with Multiple Result Sets手动编辑edmx文件 使用 3 失败并尝试了同一页面中的代码版本,但仍然没有返回任何行。 将代码恢复为 3。

我的 edmx 文件(仅相关内容):

  <FunctionImport Name="getGlobalReport2">
    <ReturnType Type="Collection(MTModel.GlobalReport2)"/>
    <ReturnType Type="Collection(MTModel.GlobalReport2)"/>
    <ReturnType Type="Collection(MTModel.GlobalReport2)"/>
    <Parameter Name="regions" Mode="In" Type="String" />
    <Parameter Name="countries" Mode="In" Type="String" />
    <Parameter Name="companySizes" Mode="In" Type="String" />
    <Parameter Name="products" Mode="In" Type="String" />
  </FunctionImport>

  <FunctionImportMapping FunctionImportName="getGlobalReport2" FunctionName="MTModel.Store.getGlobalReport2" >
    <ResultMapping>
      <ComplexTypeMapping TypeName="MTModel.GlobalReport2" />
    </ResultMapping>
    <ResultMapping>
      <ComplexTypeMapping TypeName="MTModel.GlobalReport2" />
    </ResultMapping>
    <ResultMapping>
      <ComplexTypeMapping TypeName="MTModel.GlobalReport2" />
    </ResultMapping>
  </FunctionImportMapping>

我的代码:

var x = mtEntities.getGlobalReport2(regions, countries, companySizes, products);
Response.Write(x.Count());

var y = x.GetNextResult<GlobalReport2>();
Response.Write(y.Count());

var z = x.GetNextResult<GlobalReport2>();

我已经检查过的内容:

    检查服务器是否按照How can I view live mysql queries?收到请求 运行我从服务器抓取的查询并确保它返回结果集和行 调试应用程序以查看我在途中没有错过任何异常

调用或应用似乎没有问题,只是没有返回任何行。 有什么建议吗?

编辑: 根据您关于edmx 被覆盖的cmets,只有当我从数据库重新生成模型时才会发生这种情况,而不是如果我更新它。 我不会期待别的,因为它会重新生成模型。

【问题讨论】:

您必须使用 EDMX 文件吗?如果它重新生成,您将失去自定义。 我不必使用它,但这仍然不能解决手头的问题。 我刚刚意识到这是 MySQL,而不是 MSSQL,但我最近使用 msdn.microsoft.com/en-us/data/jj691402.aspx 的“使用代码访问多个结果集”部分使用 MSSQL 进行了这项工作。 【参考方案1】:

您不认为您应该为您创建的复杂类型定义一些属性吗?例如:

<FunctionImportMapping FunctionImportName="GetGrades" 
                       FunctionName="SchoolModel.Store.GetGrades" >
  <ResultMapping>
    <ComplexTypeMapping TypeName="SchoolModel.GradeInfo">
      <ScalarProperty Name="EnrollmentID" ColumnName="enroll_id"/>
      <ScalarProperty Name="CourseID" ColumnName="course_id"/>
      <ScalarProperty Name="StudentID" ColumnName="student_id"/>
      <ScalarProperty Name="Grade" ColumnName="grade"/>
    </ComplexTypeMapping>
  </ResultMapping>
</FunctionImportMapping>

也检查this

正如 Mike 在对您的问题的评论中正确指出的那样,如果您将来更新您的 edmx 文件,如果它重新生成,您将失去自定义。

【讨论】:

这很有趣,在我添加的文章中,他们对此只字未提,因为我确实可以访问这些属性,所以它们似乎已经映射,因为复杂类型已经存在

以上是关于实体框架 - 具有多个结果集的存储过程 - 没有行返回的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

Entity Framework 6 中具有多个记录集的存储过程

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集

如何从实体框架中的存储过程中获取结果+数据库优先

从返回多个结果集的存储过程中插入临时表

来自存储过程的多个结果集的 s-s-rS 最佳实践