C# SQL Server到.Net小数,EF6 dDatabase第一个问题

C# SQL Server到.Net小数,EF6 dDatabase第一个问题,c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,我当前正在从SQL Server存储过程中读取数据,数据返回为Decimal(38,20) 我知道.Net十进制数是(28,10),但EF为此生成的模型类显示的是十进制数?。当我查询表时,代码抛出一个转换溢出错误,因为它试图将SQL Server十进制数放在.Net decimal字段中 有没有一种简单的方法可以通过数据上下文将其转换为.Net decimal?基本上,我没有修改SQL Server数据类型的权限 SQL Server数据类型: Amount Decimal(38, 20)

我当前正在从SQL Server存储过程中读取数据,数据返回为
Decimal(38,20)

我知道.Net十进制数是
(28,10)
,但EF为此生成的模型类显示的是
十进制数?
。当我查询表时,代码抛出一个转换溢出错误,因为它试图将SQL Server十进制数放在.Net decimal字段中

有没有一种简单的方法可以通过数据上下文将其转换为.Net decimal?基本上,我没有修改SQL Server数据类型的权限

SQL Server数据类型:

 Amount Decimal(38, 20)
实体

public class EntityClass
{
     public decimal? Amount { get; set; }
}
当我打电话的时候

 var eee =  _context.EntityClass
                    .Select(x => x.Amount)
                    .FirstOrDefaultAsync();
我明白了

转换溢出错误


在ApplicationDbContext中,您应该添加

  protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<EntityClass>()
            .Property(p => p.Amount )
            .HasColumnType("decimal(28,20)");
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity()
.财产(p=>p.金额)
.HasColumnType(“十进制(28,20)”);

这是.NET的SqlClient的一个错误或限制。下面是一个复制:

    using (var con = new SqlConnection("server=.;database=tempdb;Integrated Security=true"))
    {
        con.Open();
        var cmd = new SqlCommand("select cast(4210862852.86 as decimal(38,20))  val", con);
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            rdr.Read();

            var val = rdr.GetDecimal(0);
            Console.WriteLine(val);
        }
    }
问题是这个数字

select cast(cast(4210862852.86 as decimal(38,20)) as varbinary(20))
存储,并通过导线作为

0x261400010000D877FB4DEE8B51699A5005000000
SqlClient将拒绝转换最后4个字节中任何非零的十进制:

internal decimal Decimal
{
    get
    {
        ThrowIfNull();

        if (StorageType.Decimal == _type)
        {
            if (_value._numericInfo.data4 != 0 || _value._numericInfo.scale > 28)
            {
                throw new OverflowException(SQLResource.ConversionOverflowMessage);
            }
            return new decimal(_value._numericInfo.data1, _value._numericInfo.data2, _value._numericInfo.data3, !_value._numericInfo.positive, _value._numericInfo.scale);
        }
        if (StorageType.Money == _type)
        {
            long l = _value._int64;
            bool isNegative = false;
            if (l < 0)
            {
                isNegative = true;
                l = -l;
            }
            return new decimal((int)(l & 0xffffffff), (int)(l >> 32), 0, isNegative, 4);
        }
        return (decimal)this.Value; // anything else we haven't thought of goes through boxing.
    }
}
内部十进制
{
得到
{
ThrowIfNull();
if(StorageType.Decimal==\u类型)
{
如果(_value._numericInfo.data4!=0 | | | u value._numericInfo.scale>28)
{
抛出新的OverflowException(SQLResource.ConversionOverflowMessage);
}
返回新的小数(_值._numericInfo.data1,_值._numericInfo.data2,_值._numericInfo.data3,!_值._numericInfo.positive,_值._numericInfo.scale);
}
if(StorageType.Money==\u类型)
{
长l=_值。_int64;
bool为阴性=假;
if(l<0)
{
isNegative=true;
l=-l;
}
返回新的小数((int)(l&0xffffffff),(int)(l>>32),0,为负,4);
}
return(decimal)this.Value;//我们没有想到的任何东西都会经过装箱。
}
}


我在这里打开了一个针对.NET Core的问题:

什么版本的EF?您需要保留多少有效数字?数据库中的什么值导致了溢出?这肯定是一个问题(-4210862852.86000000000000000000)。是的。我可以重新设置。什么版本的EF?为什么不在类中使用double?公共double?金额{get;set;}@YairI double不仅仅是
而已,它会让事情变得更糟。它的范围比Decimal小,并且保证会导致舍入错误。它也不会影响此错误-字段的范围太长“我没有权限修改SQL Server数据类型”OP的问题是数据库字段的精度为38。
Decimal
最多可以处理28。
HasColumnType(“Decimal(28,20)”)
也不会更改现有字段的精度,因此它不会影响存储在其中的值。