EF core 6 中浮点类型的默认精度和小数位数是多少?

som*_*men 5 entity-framework-core ef-core-6.0

我收到以下警告:

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

(强调我的)

我知道如何设置精度和小数位数,但我想知道 EF 默认值 -或的默认精度和小数位数decimal到底是什么?floatdouble

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

Ger*_*old 9

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

源代码(参见字段的初始化_clrTypeMappings)显示小数默认映射到decimal(18,2),就像它们在实体框架中一直那样。

float只有double精度(和指数,但没有比例),所以这个问题在这里并不适用。但对于这些类型来说,它们映射到哪种 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; }
}
Run Code Online (Sandbox Code Playgroud)

...我们得到这个:

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]))
Run Code Online (Sandbox Code Playgroud)

因此从 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);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该Double属性将映射到realSQL Server 中的 a,因为它具有实际的存储大小