设置查询结果对象的小数精度
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
【讨论】:
以上是关于设置查询结果对象的小数精度的主要内容,如果未能解决你的问题,请参考以下文章