gpt4 book ai didi

c# - 尽管设置了精度,但 MSSQL 表中的十进制数会四舍五入

转载 作者:行者123 更新时间:2023-12-04 04:00:45 27 4
gpt4 key购买 nike

我的 c# 对象有一个小数属性:

public decimal LastPrice { get; set; }
在处理我的对象时,十进制值被设置。例如:
LastPrice = 0.091354;
我修改了我的 DbContext 以提高小数精度,如另一篇 stackoverflow 帖子中所述:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)))
{
property.SetColumnType("decimal(38, 10)");
}
}
Microsoft Sql Server Management Studio 中的表设计 View 反射(reflect)了这种配置。
这是从 SSMS 脚本化的表:
CREATE TABLE [dbo].[TradedCurrencyPairs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[LastPrice] [decimal](38, 10) NOT NULL,
...
当我在调试过程中检查对象添加到我的 DbContext 时,它看起来不错:
When I check the object during debugging as it gets added to my DbContext, it looks good
但在数据库中它最终为 0.0000000000。
据我所知,该值仍在四舍五入,就好像它的精度为 2。一个应该是 0.09232 的值变成了 0.0900000000。
所以所有小数仍然被削减。
我尝试了几种不同的数据注释:
// [PrecisionAndScale(20, 10)]
//[RegularExpression(@"^\d+\.\d{20,10}$")]
//[Range(0, 99999999999999999999.9999999999)]
[Range(typeof(decimal), "20", "10")]
但他们没有帮助。
从 SSMS 插入数据工作正常:
插入交易货币对
值 ('tzt', 'ttt', 'rrrr', '20120618 10:34:09 AM', 'hgghghg', 0.123456, 1, 0.123456789, 0.123456, 0.123);

我的列的 DbModelSnapshot 如下所示:
            b.Property<decimal>("LastPrice")
.HasPrecision(10)
.HasColumnType("decimal(20, 10)");
我也试过:
TradedCurrencyPair TestPair = new TradedCurrencyPair("one", "two", "Bibox", DateTime.Now, "unknown", 0.1234567890M, 1, 0.1234567890M, 0.1234567890M, 0.1234567890M);
context.TradedCurrencyPairs.Add(TestPair);
context.SaveChanges();
结果是一样的...
在设置值和它在数据库中结束之间的某个地方,它被修改:/
这是 SQL 表:
/****** Object:  Table [dbo].[TradedCurrencyPairs]    Script Date: 25/07/2020 09:32:32 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TradedCurrencyPairs](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TradedCurrency] [nvarchar](max) NULL,
[BaseCurrency] [nvarchar](max) NULL,
[Exchange] [nvarchar](max) NULL,
[DateTime] [datetime2](7) NOT NULL,
[TransactionType] [nvarchar](max) NULL,
[LastPrice] [decimal](20, 10) NOT NULL,
[ExchangeInternalPairId] [int] NOT NULL,
[High24h] [decimal](20, 10) NOT NULL,
[Low24h] [decimal](20, 10) NOT NULL,
[Volume24h] [decimal](20, 10) NOT NULL,
CONSTRAINT [PK_TradedCurrencyPairs] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
什么工作不使用 Entity Framework :
SqlCommand command = new SqlCommand("insert into TradedCurrencyPairs values('one', 'two', 'Bibox', convert(datetime, '18-06-12 10:34:09 PM', 5), 'unknown', 0.1234567890, 1, 0.1234567890, 0.1234567890, 0.1234567890); ", cnn);
This way the decimals do not get modified. So EF causes the issue.
有人可以向我解释我做错了什么吗?
非常感谢!

最佳答案

当我从这里发布代码时:
Entity Framework Core - setting the decimal precision and scale to all decimal properties
我仍然习惯使用 EF Core 3,所以我启用了 EF Core 3 的代码。
我不记得我使用了测试包并将它们更新到 EF Core 5 预览版。
所以使用这个:

    foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)))
{

// EF Core 3
// property.SetColumnType("decimal(20, 10)");
// property.SetPrecision(10);

// EF Core 5
property.SetPrecision(18);
property.SetScale(6);
}
而不是这个:
    foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)))
{

EF Core 3
property.SetColumnType("decimal(20, 10)");
property.SetPrecision(10);

// EF Core 5
// property.SetPrecision(18);
// property.SetScale(6);
}
完美地工作。
很抱歉因为我的愚蠢错误而浪费了您的时间:/

关于c# - 尽管设置了精度,但 MSSQL 表中的十进制数会四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63079237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com