非常奇怪的 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;
}
重现问题的步骤:
- 首先通过 SQL 数据库项目和 VS 模式比较添加 table
- 运行 将值添加到数据库的测试。调试测试时一切看起来都是正确的
- 检查 SSMS 中的数据库 table。该值显示为 0.00000000
- 运行 相同的测试,但注释掉添加部分并取消注释 idToUse = 1
- 现在我看到奇怪的代码问题,例如 entity.Value 是 0.00003110,但是 value1 - value4 都是 0.00000000,但是 updatedValue 和 newValue 是正确的。
- 测试结束后DB值还是0.00000000
- 直接将SSMS中的DB值更新为0.00003110。 运行 再次测试,现在测试中的一切都是正确的,之后 SSMS 中的 DB 值也是正确的
- 添加新值的行为与第一个相同
- 删除 table 并重新创建它,一切都回到方块 1
环境详情:
- SQL 数据库项目 - 通过 VS 模式比较更新的数据库模式
- Azure SQL 数据库
- .net 5
- EF6
- VS 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; }
}
数据库模式:
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);
}
我很惊讶我以前从未遇到过这个问题!
所以我看到一些非常奇怪的行为,我无法弄清楚出了什么问题,希望有人能提供帮助。最初我是在一个更大的应用程序中看到它的,它有很多值,但我把它简化为一个简单的例子。
测试代码:
[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;
}
重现问题的步骤:
- 首先通过 SQL 数据库项目和 VS 模式比较添加 table
- 运行 将值添加到数据库的测试。调试测试时一切看起来都是正确的
- 检查 SSMS 中的数据库 table。该值显示为 0.00000000
- 运行 相同的测试,但注释掉添加部分并取消注释 idToUse = 1
- 现在我看到奇怪的代码问题,例如 entity.Value 是 0.00003110,但是 value1 - value4 都是 0.00000000,但是 updatedValue 和 newValue 是正确的。
- 测试结束后DB值还是0.00000000
- 直接将SSMS中的DB值更新为0.00003110。 运行 再次测试,现在测试中的一切都是正确的,之后 SSMS 中的 DB 值也是正确的
- 添加新值的行为与第一个相同
- 删除 table 并重新创建它,一切都回到方块 1
环境详情:
- SQL 数据库项目 - 通过 VS 模式比较更新的数据库模式
- Azure SQL 数据库
- .net 5
- EF6
- VS 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; }
}
数据库模式:
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);
}
我很惊讶我以前从未遇到过这个问题!