设置查询结果对象的十进制精度

时间:2019-09-14 07:28:45

标签: c# entity-framework-core entity-framework-core-2.1

我有一个通过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)

但是没有属性。具有精度

我应该尝试什么?

[更新]

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

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

3 个答案:

答案 0 :(得分:1)

当前,EF Core没有提供独立于数据库的方式来指定数字类型的精度和小数位数(类似于EF6 HasPrecision)。

唯一的方法是使用HasColumnType并指定数据库特定的类型。如果需要支持其他数据库,则必须对每种数据库类型使用if语句和不同的HasColumnType

对于SqlServer,应该是

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

答案 1 :(得分:1)

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

source

答案 2 :(得分:1)

从 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