EF6 - 从十进制到int32的无效转换

时间:2018-05-31 09:12:12

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

我有一些表格,其字段定义为......

...
public int? oneField { get; set; }
...

相应的c#实体模型......

Property(r => r.oneField)
    .HasColumnName("oneField");

流畅的配置......

System.InvalidOperationException: The specified cast from a materialized
  'System.Decimal' type to a nullable 'System.Int32' type is not valid.

好吧,有了上述所有这些,我在从数据库中检索数据时遇到以下异常。

{{1}}

有什么想法来解决这个问题?我可以理解,如果NUMERIC字段有一个可能导致问题的小数部分,但只是一个2位的整数值,为什么不能被转换成INT32?

注意:我知道如果我将表中的字段更改为INT问题将会得到解决,但我想保留NUMERIC(2),因为它表示更好地存储在那里的值( 2位数字)。

4 个答案:

答案 0 :(得分:4)

如果您想使用NUMERIC(2),则需要decimal模型属性,否则您将看到您报告的转换错误。因此,您的解决方案是更改数据库或更改模型。

然而,NUMERIC(2)对于您的目的来说是过度的,并且将消耗5个字节,您只需要数字最多99个。相反,您应该考虑使用TINYINT,这将允许您存储从0到0的数字255.这意味着存储只是一个字节,您的模型可以byte匹配。

答案 1 :(得分:2)

据我了解,它告诉您该列已实现为System.Decimal对象,并且您尝试将其强制转换为不受支持的System.Int32对象。尝试使用INTEGER定义数据库列

或者使用System.Decimal来定义您的EF对象

答案 2 :(得分:1)

好的,如果你想要它,这是你的模型:

internal decimal? OneFieldIntenal { get; set; }
public int? OneField
{
    get => OneFieldIntenal.HasValue ? (int)OneFieldIntenal.Value : null;
    set => OneFieldIntenal = value;
}

这是你的映射:

Property(r => r.OneFieldIntenal)
    .HasColumnName("oneField");

但是只有在绝对确定你在做什么并且你需要让你输入不匹配时才使用它。这个解决方案很难看。

答案 3 :(得分:1)

假设您使用的是sql server。以下是.NET整数类型和最大拟合数字类型:

  • SByte => -128到127,最多可达NUMERIC(2)
  • Int16 => -32,768到32,767,最多可达NUMERIC(4)
  • Int32 => -2,147,483,648至2,147,483,647,最多可达NUMERIC(9)
  • Int64 => -9,223,372,036,854,775,808至9,223,372,036,854,775,807,最多可达NUMERIC(18)
  • decimal最多可以保留7.9 * 10 ^ 28到NUMERIC(28)

问题是我怀疑EF不会喜欢你的转换,因为你首先编码数据库并且不想改变任何东西,我认为你唯一能做的就是接受它为十进制并投下客户端侧。