设置查询结果对象的小数精度

Posted

技术标签:

【中文标题】设置查询结果对象的小数精度【英文标题】:Set decimal precision for query result object 【发布时间】:2020-01-15 21:45:58 【问题描述】:

我有一个通过 Nuget 提供给我的课程。我没有来源。

 public class SpecialProductResult
  
    public int id  get; set; 
    public decimal SpecialPercent get;set;
  

我想从存储过程中填充 SpecialProductResult 列表

所以在我的 DbContext 中我有

public DbQuery<SpecialProductDto> SpecialProducts  get; set; 

我使用

填充列表
var specialProducts =   connect.SpecialProducts.FromSql("spGetSpecialProducts").ToList()

在错误日志中我看到类似

的消息

没有为实体上的小数列“SpecialPercent”指定类型 输入“SpecialProductResult”。这将导致值静默 如果它们不符合默认精度和比例,则被截断。 显式指定可以容纳所有的 SQL Server 列类型 使用“ForHasColumnType()”的值。

看了this question,想试试

modelBuilder.Entity<SpecialProductResult>().Property(o => o.GoldPercent).HasPrecision(18,4)

但是没有属性 .HasPrecision

我应该尝试什么?

[更新]

我尝试了 Ivan Stoev 的回答,但收到了运行时错误

The entity type 'SpecialProductResult' cannot be added to the model because a query type with the same name already exists

【问题讨论】:

GoldPercent 显然是错误的,不是吗?然后按照错误消息的提示,尝试 HasColumnType("decimal(18.4)") 而不是 HasPrecision() 。或者,您可以使用属性属性 [Column(TypeName = "decimal(18,4)")] 而不是使用 fluent api 【参考方案1】:

目前 EF Core 不提供独立于数据库的方式来指定数值类型的精度和小数位数(类似于 EF6 HasPrecision)。

这样做的唯一方法是使用HasColumnType 并指定数据库特定类型。如果您需要支持不同的数据库,您必须使用if 语句,并为每种数据库类型使用不同的HasColumnType

对于 SqlServer,它会是

modelBuilder.Query<SpecialProductResult>()
    .Property(o => o.GoldPercent)
    .HasColumnType("decimal(18,4)");

【讨论】:

在 EF5 中,我尝试了 .HasColumnType() 并尝试了 HasPrecision(),但日志文件中仍显示警告。如何让警告消失? @PeetBrits 两者都应该工作(在我的测试中工作)。例如.HasPrecision(18, 4)【参考方案2】:
public class Part

    public Guid PartId  get; set; 
    public string Number  get; set; 
    [Column(TypeName = "decimal(18,4)")] // <--
    public decimal Size  get; set; 

source

【讨论】:

【参考方案3】:

从 EF Core 2.0 开始就有 IEntityTypeConfiguration。如果您使用该方法,您可以按如下方式解决:

class PartConfiguration : IEntityTypeConfiguration<Part>

  public void Configure(EntityTypeBuilder<Part> builder)
    
     builder.Property(c => c.PartId);
     builder.Property(c => c.Number);
     builder.Property(c => c.Size)
            .HasPrecision(18, 4) <-- Use Either This
            .HasColumnType("decimal(18,4)"); <-- Or this
  


...
// OnModelCreating
builder.ApplyConfiguration(new PartConfiguration());

有关使用模型构建器的更多信息,请参阅Microsoft Docs

【讨论】:

以上是关于设置查询结果对象的小数精度的主要内容,如果未能解决你的问题,请参考以下文章

防止 MATLAB 舍入数字并设置小数精度

oracle中查询结果中有小数点

Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]

knime 设置 小数点精度

vb.net怎么设置数字保留小数点位数

当数字中包含“E”时,如何设置小数精度? [复制]