非常奇怪的C#sql数据库小数问题



所以我看到了一些非常奇怪的行为,我不知道出了什么问题,希望有人能帮忙。最初,我在一个有很多值的更大应用程序中看到了这一点,但我将其简化为一个简单的示例。

测试代码:

[Test]
public void DecimalIssue()
{
decimal decimalValueToSet = 0.00003110M;
var modelToAdd = new TestModel { Value = decimalValueToSet };
TestModel addedEntity = _db.Add(modelToAdd);
int idToUse = addedEntity.Id;
decimal? addedValue1 = addedEntity.Value;
//int idToUse = 1;
TestModel entity = _db.GetById(idToUse);
decimal? value1 = entity.Value; // Sometimes value1 is 0.00000000 and sometimes it's 0.00003110
decimal value2 = entity.Value.Value;
decimal? value3 = Convert.ToDecimal(entity.Value);
double value4 = Convert.ToDouble(entity.Value);
decimal? value5 = decimalValueToSet;
entity.Value = decimalValueToSet;
TestModel updatedEntity = _db.Update(entity);
decimal? updatedValue = updatedEntity.Value;
TestModel newEntity = _db.GetById(idToUse);
decimal? newValue = newEntity.Value;
}

复制问题的步骤:

  1. 首先通过SQL数据库项目和VS模式比较添加表
  2. 运行测试以将值添加到数据库中。调试测试时,一切看起来都是正确的
  3. 检查SSMS中的数据库表。数值显示为0.00000000
  4. 运行相同的测试,但注释掉add部分并取消注释idToUse=1
  • 现在我看到了一些奇怪的代码问题,比如实体。值为0.00003110,但值1-值4均为0.00000000,但updatedValue和newValue是正确的
  • 测试结束后,DB值仍为0.00000000
  1. 直接将SSMS中的DB值更新为0.00003110。再次运行测试,现在测试中的一切都是正确的,之后SSMS中的DB值也是正确的
  2. 添加新值的操作与第一个值相同
  3. 删除表格并重新创建,一切都回到原点1

环境详细信息:

  • SQL数据库项目-通过VS模式比较更新的DB模式
  • Azure SQL数据库
  • .net 5
  • EF6
  • 与2019年相比-16.9.4
  • SSMS-18.9.1

不确定这是否有帮助,但我添加的大多数值在SSMS中显示为0.00000000,但有些值显示不同。例如,如果我使用0.50516090M,那么它在SSMS中显示为0.50000000。

型号:

[Table("Test")]
public class TestModel
{
[Key]
public int Id { get; set; }
public decimal? Value { get; set; }
}

DB架构:

CREATE TABLE [dbo].[Test] (
[Id]    INT              IDENTITY (1, 1) NOT NULL,
[Value] DECIMAL (12, 8)  NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([Id] ASC)
);

感谢@JeroenMoster为我指明了正确的方向。我做了更多的挖掘,发现这个页面有我想要的答案,那就是做以下事情:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestModel>().Property(x => x.Value).HasPrecision(12, 8);
}

我很惊讶我以前从未遇到过这个问题!

最新更新