【问题标题】:Why getting property could not be set to a 'System.Int32' value and must be a non-null value of type 'System.Boolean'为什么无法将获取属性设置为“System.Int32”值并且必须是“System.Boolean”类型的非空值
【发布时间】: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


【解决方案1】:

这不是一个精确的答案,但可以解决这个问题。

我们发现的解决方法是复制整个 SOME QUERY 并使用永远不会获取任何数据的 WHERE。

这可能是因为 EF 需要真正的 SQL 表字段才能正确映射。如果是这样的话,我可能是错的,所以请纠正我

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多