【问题标题】:What are the default precision and scale for floating point types in EF core 6?EF Core 6 中浮点类型的默认精度和小数位数是多少?
【发布时间】:2022-01-14 05:07:09
【问题描述】:

我收到以下警告:

没有为实体类型“ProductStatisticsKeylessEntity”上的小数属性“PurchasePrice”指定商店类型。 如果值不符合默认精度和比例,这将导致它们被静默截断。 使用“HasColumnType”显式指定可以容纳“OnModelCreating”中所有值的 SQL 服务器列类型,指定使用“HasPrecision”的精度和比例,或使用“HasConversion”配置值转换器。

(强调我的)

我知道如何设置精度和比例,但我想知道 EF 默认值 - decimalfloatdouble 的默认精度和比例到底是多少?

也许默认值足够好,我可以将精度/比例设置为相同的值以隐藏错误。

【问题讨论】:

  • 很惊讶这个信息太难了..
  • 将此作为评论而不是答案,因为我不是 100% 确定这一点,但我相信默认映射掌握在数据库提供者手中。因此,例如,Oracle 的默认映射可能与 SQL Server 的不同。
  • 请注意,这仅与十进制有关,与浮点和双精度相反,整数和小数部分之间具有固定的分隔。没有 Double(18,2) 这样的东西。

标签: entity-framework-core ef-core-6.0


【解决方案1】:

我不知道有关 C# decimal 到 SQL Server decimal 的默认精度和比例映射的任何官方文档。最快的方法就是尝试。

source code(请参阅_clrTypeMappings 字段的初始化)表明小数默认映射到decimal(18,2),就像它们一直在实体框架中一样。

floatdouble 都只有精度(和指数,但没有比例),所以这个问题在这里并不适用。但是对于这些类型,它们映射到哪些 SQL Serer 类型很重要,因为双方的定义不同,令人困惑。

如果我们让 EF 从这个类生成一个表...

public class Num
{
    public int Id { get; set; }
    public decimal Dec { get; set; }
    public float Float { get; set; }
    public double Double { get; set; }
}

...我们得到这个:

CREATE TABLE [dbo].[Nums](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Dec] [decimal](18, 2) NOT NULL,
    [Float] [real] NOT NULL,
    [Double] [float] NOT NULL,
 CONSTRAINT [PK_Nums] PRIMARY KEY CLUSTERED ([Id]))

所以从 CLR 到 SQL Server 类型的默认映射是:

  • decimaldecimal(18,2)
  • floatreal
  • doublefloat

请注意,对于float (CLR),这并不是真正的默认值,它是唯一有意义的映射。对于double,这是一个默认值,因为double 的精度可以通过如下映射指令来降低:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Num>().Property(e => e.Double).HasPrecision(24);
}

在这种情况下,Double 属性将映射到 SQL Server 中的 real,因为它具有 storage size of a real

【讨论】:

  • Welp 我认为SqlServerTypeMappingSource 说明了一切。感谢您的小调查。
猜你喜欢
  • 2010-10-10
  • 2020-09-09
  • 2021-11-06
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2011-03-31
相关资源
最近更新 更多