【问题标题】:Entity Framework 6 stored procedure call resultset decimal value is 0Entity Framework 6 存储过程调用结果集十进制值为0
【发布时间】:2017-03-05 17:35:52
【问题描述】:

这是一个使用 EF6 的 ASP.NET MVC 项目。需要调用采用表值参数的存储过程。 EntityFrameworkExtras用于方便通话。

存储过程返回一个包含多行和多列的结果集。其中一列是Decimal(8,2)。存储过程通过调用EF6的

来执行
context.ExecuteStoredProcedure<ClassMatchingResultset>

调用成功。返回一个List&lt;ClassMatchingResultset&gt;。除了所有行上为零的小数列外,其中的所有属性都已填写。

存储过程在 SSMS 中测试良好,并在使用相同参数调用时返回十进制值。

ClassMatchingResultset 使用 Decimal 数据类型作为小数属性。存储过程正在返回一个临时表上的 select 语句,其中包含同名的十进制列。

这里发生了什么?十进制属性的名称是TotalCostTotalCost 是不是根本没有设置好? EF 将TotalCost 设置为零是因为读取结果集的问题吗?

【问题讨论】:

  • 你好,可以给我们看一下代码吗?
  • 你会遇到这个问题吗? stackoverflow.com/questions/18166992/…
  • 这似乎不是类型转换期间的舍入问题。我确实尝试过您将数字硬编码到proc的结果集中的建议。那行得通!如果我输入 21,EF 会将其读取为 int,并引发类型转换错误。如果我输入21.1,它就成功了。我尝试将 proc 中的实际结果转换为 varchar,即cast(21.1 as varchar(10)) as TotalCost 你能相信 EF 将其转换为“0.00”吗?
  • 多年前我创作了 Crystal Reports。解释某些 procs 的结果会有困难。我们发现它正在阅读整个过程来解释结果集。所以我尝试将结果插入一个新的 cte,然后是一个新的临时表,然后从中返回结果。没有骰子。是时候编写一个测试项目了。完成后我会分享代码。

标签: c# sql-server entity-framework entity-framework-6


【解决方案1】:

结果证明这与 EF6 或 EF6 Extras 无关。从 SSMS 调用时 proc 工作正常的原因是因为 TVP 在那里正确构建。然而,C# 代码用不正确的值填充 TVP,导致 proc 为十进制列返回零。啊!

反复简化.net代码和proc的故障排除技术,每次迭代后重新测试,最终查明问题,但花了很长时间。

测试驱动开发会立即发现这一点并节省大量时间。根据我的经验,要让 TDD 真正有效,它必须在使用 IoC 容器和模拟框架的项目中。这些项目似乎来之不易。

使用 SQL 扩展事件来跟踪调用可能已经显示了传递给 proc 参数的值。此信息不适用于 EF6 的内置日志记录功能。

【讨论】:

  • 您始终可以在 EF 中打开跟踪以查看正在生成哪些查询并使用 SQL Profiler 查看正在发送到 SQL Server 的参数
  • EF 跟踪不显示传递给存储过程的参数值。 Profiler 不适用于 Azure。它已被弃用并替换为扩展事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多