实体框架6存储过程调用结果集十进制值为0

时间:2016-10-24 02:41:10

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

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

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

执行存储过程
context.ExecuteStoredProcedure<ClassMatchingResultset>

通话成功。返回List<ClassMatchingResultset>。除了十进制列在所有行上都为零之外,其中的所有属性都被填充。

存储过程在SSMS中测试正常,并在使用相同参数调用时返回小数值。

ClassMatchingResultset使用Decimal数据类型作为decimal属性。存储过程在临时表上返回一个带有同名十进制列的select语句。

这里发生了什么? decimal属性的名称是TotalCostTotalCost根本没有设定吗?由于读取结果集时出现问题,EF设置TotalCost为零吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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