这是一个使用EF6的ASP.NET MVC项目。需要调用存储过程,该存储过程采用表值参数。 EntityFrameworkExtras
用于促进通话。
存储过程返回包含多个行和列的结果集。其中一列是Decimal(8,2)
。通过调用EF6的
context.ExecuteStoredProcedure<ClassMatchingResultset>
通话成功。返回List<ClassMatchingResultset>
。除了十进制列在所有行上都为零之外,其中的所有属性都被填充。
存储过程在SSMS中测试正常,并在使用相同参数调用时返回小数值。
ClassMatchingResultset
使用Decimal
数据类型作为decimal属性。存储过程在临时表上返回一个带有同名十进制列的select语句。
这里发生了什么? decimal属性的名称是TotalCost
。 TotalCost
根本没有设定吗?由于读取结果集时出现问题,EF设置TotalCost
为零吗?
答案 0 :(得分:0)
结果与EF6或EF6 Extras无关。从SSMS调用proc时工作正常的原因是因为TVP在那里正确构建。然而,C#代码用不正确的值填充TVP,导致proc为小数列返回零。啊!
重复简化.net代码和proc以及每次迭代后重新测试的故障排除技术最终确定了问题,但它花了很长时间。
测试驱动开发会立即发现这一点并节省了大量时间。根据我的经验,对于真正有效的TDD,它必须在使用IoC容器和模拟框架的项目中。这些项目似乎很难得到。
使用SQL扩展事件来跟踪调用可能已经显示了传递给proc参数的值。 EF6的内置日志记录功能无法使用此信息。