【问题标题】:Sqlite with Entity framework - Error: "Specified cast is not valid"带有实体框架的 Sqlite - 错误:“指定的转换无效”
【发布时间】:2011-08-10 15:29:15
【问题描述】:

字段类型是钱,如果我在字段中输入“0”或“1”,我会收到此错误:

System.Reflection.TargetInvocationException:

Exception has been thrown by the target of an invocation. --->
System.InvalidCastException: Specified cast is not valid.

 at System.Data.SQLite.SQLiteDataReader.VerifyType(Int32 i, DbType typ)
 at System.Data.SQLite.SQLiteDataReader.GetBoolean(Int32 i)

 --- End of inner exception stack trace ---

这是来自模型设计师:

<Property Name="Amount" Type="decimal" Precision="53" />  

====

    <EdmScalarPropertyAttribute(EntityKeyProperty:=False, IsNullable:=True)>
<DataMemberAttribute()>
Public Property Amount() As Nullable(Of Global.System.Decimal)
    Get
        Return _Amount
    End Get
    Set(ByVal value As Nullable(Of Global.System.Decimal))
        OnAmountChanging(Value)
        ReportPropertyChanging("Amount")
        _Amount = StructuralObject.SetValidValue(value)
        ReportPropertyChanged("Amount")
        OnAmountChanged()
    End Set
End Property

Private _Amount As Nullable(Of Global.System.Decimal)
Private Partial Sub OnAmountChanging(value As Nullable(Of Global.System.Decimal))
End Sub

Private Partial Sub OnAmountChanged()
End Sub

获取错误的代码:

 Dim Query = From c In EnData.Transactions Where c.TranID = 660 ' this tran is the amount 0

        For Each tran In Query 'Error here

        Next

【问题讨论】:

  • 我添加了一些代码,这是您要找的吗?
  • 你能告诉我们你设置金额的代码吗?
  • 我还没有设置它。我只是通过执行一个简单的查询“Dim Q = (From e in myContext.Transaction)”得到错误
  • @Ezi 显示发生错误的部分代码,以及与该部分相关的所有代码。
  • 你确定'Amount'字段是sqlite数据库中的十进制类型吗?如果您在金额字段中存储“2”或“42”,您的代码是否有效?

标签: .net vb.net entity-framework sqlite


【解决方案1】:

我有问题...不是金额字段。另一列有点类型,有时它不喜欢我写假或真的方式。这会导致问题。

解决办法是用1代表真,0代表假,这样总是可以的。

【讨论】:

  • 使用 EF 6.02 和 SQLite 1.0.91 这仍然发生,因此浪费了一天。非常感谢!!!!
【解决方案2】:

我为 Microsoft SQL Server 编写 SQL。如果以下示例对SqLite 无效,请告诉我,我将删除此答案。

问题:什么是:StructuralObject.SetValidValue(value)?这是自定义功能吗?如果是的话,你能定义一下吗?

也许修改你的 VB 代码来做以下帮助:

Public Property Amount() As System.Decimal
    Get
        Return _Amount
    End Get
    Set(ByVal value As Global.System.Decimal)
        OnAmountChanging(Value)
        ReportPropertyChanging("Amount")
        If value = 0 Then
          _Amount = 0.00M
        Else If value = 1 Then
          _Amount = 1.00M
        Else
          _Amount = StructuralObject.SetValidValue(value)
        End If
        ReportPropertyChanged("Amount")
        OnAmountChanged()
    End Set
End Property

通常情况下,我更喜欢将“最真实”的案例放在最上面,但我的 VB 技能并不是那么好。

我希望这会有所帮助。

【讨论】:

  • 这是自动生成的代码,这里没有Null问题。
  • @Ezi:更新代码以测试 1 和 0。也许 SQLiteSetValidValue 将输入解释为 IntegerBoolean。上面指示的值应该强制 1 和 0 为双精度(M 代表金钱)。
  • 感谢您提供帮助,请参阅问题中的编辑。我找到了问题所在。
猜你喜欢
  • 1970-01-01
  • 2013-12-30
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多