【发布时间】:2016-01-19 06:25:10
【问题描述】:
我得到了以下 SP,运行应用程序时出现错误:
“spFADMGetHours_Result”上的“HaveReaction”属性不能 设置为“System.Int32”值。您必须将此属性设置为 'System.Boolean' 类型的非空值
嗯,HaveReaction 有点,当我将存储过程添加到上下文中并查看它的属性时,它是布尔类型,所以它可以很好地识别它。我试图从上下文中删除有关此 SP 的所有内容并重新插入它,但没有成功。我不明白为什么我会收到此错误,因为该字段被声明为位并且 EF 将其作为布尔值导入,所以出了什么问题,在哪里以及为什么?
ALTER PROCEDURE [dbo].[spFADMGetHours]
@Patients varchar(max),
@DateToProcess varchar(10)
AS BEGIN DECLARE @sql varchar(max)
-- The IF is for entity framework integration
if @Patients is null and @DateToProcess is null
begin
SELECT CAST(NULL AS datetime) AS SOMEDATE, CAST(NULL AS time) as SOMEHOUR, 0 AS TotalToTake, 0 AS TotalTakenOrIncident, CAST(0 AS bit) AS HaveReaction
end
else
begin
SET @sql = 'SOME QUERY'
exec(@sql)
end
END
【问题讨论】:
-
SOME QUERY怎么样?会不会有问题?看来,第一个if是正确的。 -
SOME QUERY 是一个查询,它返回的内容与 if 它很大,所以我认为显示它并不相关。 SOME QUERY 中的所有字段都具有相同的数据类型,当然这个 SOME QUERY 对 EF 根本不可见,因为 EF 需要 if 才能知道如何构造 COMPLEX TYPE。
-
我们将 0 AS TotalToTake 更改为 CAS(0 AS decimal(18,2)) AS TotalToTake,我们现在面临 EF 的相同问题。它报告错误: System.InvalidOperationException: ''spFADMGetDays_Result'' 上的 ''TotalToTake'' 属性无法设置为 ''System.Int32'' 值。您必须将此属性设置为“System.Decimal”类型的非空值。但是,当我检查属性时,它是十进制类型,所以 EF 和 SQL 都是十进制的。为什么两边都是十进制时要设置为 System.Int32 ?
-
最后,我们发现的解决方法是复制整个 SOME QUERY 并使用永远不会获取任何数据的 WHERE。这实际上是有效的。似乎 CASTING 是 CORE 中某处的 EF 无法理解的东西!
标签: entity-framework