非常奇怪的 C# sql db 十进制问题

Very odd C# sql db decimal issue

所以我看到一些非常奇怪的行为,我无法弄清楚出了什么问题,希望有人能提供帮助。最初我是在一个更大的应用程序中看到它的,它有很多值,但我把它简化为一个简单的例子。

测试代码:

[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 模式比较添加 table
  2. 运行 将值添加到数据库的测试。调试测试时一切看起来都是正确的
  3. 检查 SSMS 中的数据库 table。该值显示为 0.00000000
  4. 运行 相同的测试,但注释掉添加部分并取消注释 idToUse = 1
  1. 直接将SSMS中的DB值更新为0.00003110。 运行 再次测试,现在测试中的一切都是正确的,之后 SSMS 中的 DB 值也是正确的
  2. 添加新值的行为与第一个相同
  3. 删除 table 并重新创建它,一切都回到方块 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; }
}

数据库模式:

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

感谢@JeroenMostert 为我指明了正确的方向。 我做了更多挖掘,发现 有我正在寻找的答案,即执行以下操作:

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

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