som*_*men 5 entity-framework-core ef-core-6.0
我收到以下警告:
未为实体类型“ProductStatisticsKeylessEntity”上的小数属性“PurchasePrice”指定商店类型。如果值不符合默认精度和小数位数,这将导致值被静默截断。使用“HasColumnType”显式指定可容纳“OnModelCreating”中所有值的 SQL Server 列类型,使用“HasPrecision”指定精度和小数位数,或使用“HasConversion”配置值转换器。
(强调我的)
我知道如何设置精度和小数位数,但我想知道 EF 默认值 -或的默认精度和小数位数decimal到底是什么?floatdouble
也许默认值足够好,我可以将精度/比例设置为相同的值以隐藏错误。
我不知道任何关于 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 类型的默认映射是:
decimal到decimal(18,2)float到realdouble到float请注意,对于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,因为它具有实际的存储大小。
| 归档时间: |
|
| 查看次数: |
4631 次 |
| 最近记录: |