设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)

简介: 原文:设置EntityFramework中decimal类型数据精度 EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。 e.g. 2.19990将会被保存为2.

原文:设置EntityFramework中decimal类型数据精度

EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。

e.g.  2.19990将会被保存为2.20

1.解决方案一是网上找到常见的方法为重写DbContext的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{            
  modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(18, 5);
}

但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。

2.解决方案二是我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。

调用:

 

其中 [DecimalPrecision(18, 5)]即是我们自定义的精度Attribute

具体实现代码如下:

 /// <summary>
     /// <para>自定义Decimal类型的精度属性</para>
     /// </summary>
     [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
     public   class DecimalPrecisionAttribute : Attribute
     {
 
         #region Field
         private byte _precision = 18;
         public byte _scale = 5;
         #endregion
 
         #region Construct
         /// <summary>
         /// <para>自定义Decimal类型的精确度属性</para>
         /// </summary>
         /// <param name="precision">precision
         /// <para>精度(默认18)</para></param>
         /// <param name="scale">scale
         /// <para>小数位数(默认5)</para></param>
         public DecimalPrecisionAttribute(byte precision = 18, byte scale = 5)
         {
             Precision = precision;
             Scale = scale;
         } 
         #endregion
         
         #region Property
         /// <summary>
         /// 精确度(默认18)
         /// </summary>
         public byte Precision
         {
             get { return this._precision; }
             set { this._precision = value; }
         }
 
         /// <summary>
         /// 保留位数(默认5)
         /// </summary>
         public byte Scale
         {
             get { return this._scale; }
             set { this._scale = value; }
         } 
         #endregion
     }
  /// <summary>
    /// 用于modelBuilder全局设置自定义精度属性
    /// </summary>
    public class DecimalPrecisionAttributeConvention
        : PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
    {
        public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
        {
            if (attribute.Precision< 1 || attribute.Precision> 38)
            {
                throw new InvalidOperationException("Precision must be between 1 and 38.");
            }
            if (attribute.Scale > attribute.Precision)
            {
                throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
            }
            configuration.HasPrecision(attribute.Precision, attribute.Scale);
        }
    }

 

 

再在DbContext重写OnModelCreating,添加自定义的DecimalPrecisionAttributeConvention即可以方便地任意添加需要精度控制的字段。

    public class Project_DbContext : DbContext
    {
        public Project_DbContext() : base("DefaultConnection") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
            base.OnModelCreating(modelBuilder);
        }

    }

 

目录
相关文章
|
6月前
|
JSON 前端开发 数据格式
全局日期请求转换处理
全局日期请求转换处理
46 0
|
存储 算法 NoSQL
实战:第十九章:存入Long类型对象,在代码中使用Long类型接收,结果报类型转换错误
实战:第十九章:存入Long类型对象,在代码中使用Long类型接收,结果报类型转换错误
102 0
实战:第十九章:存入Long类型对象,在代码中使用Long类型接收,结果报类型转换错误
|
JSON 前端开发 JavaScript
【SpringBoot+MyBatisPlus】分页的实现以及使用数值转换器来解决long型id精度丢失问题
分页的实现以及使用数值转换器来解决long型id精度丢失问题
311 0
【SpringBoot+MyBatisPlus】分页的实现以及使用数值转换器来解决long型id精度丢失问题
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
|
JSON JavaScript Java
修复Long类型太长,而Java序列化JSON丢失精度问题的方法
Java序列化JSON时long型数值,会出现精度丢失的问题。 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 解决办法一: 使用ToStringSerializer的注解,让系统序列化 时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class) private Long createdBy; 上述方法需要在每个对象都配上该注解,此方法过于繁锁。
4620 0
|
存储 数据安全/隐私保护 C++
用户自定义结构数据与VARIANT转换
将用户自定义的C结构数据存储成VARIANT类型,需要时再将VARIANT类型转为用户自定义的结构数据,有十分现实的意义,既然我们不想为这样的结构数据写一个COM包装类。虽然有很多方法和手段生成这样的VARIANT,但是,多数时候可能需要一个更加简单的,灵活的方法。
850 0
获取表结构信息(字段名,类型,长度,精度,小数位数,主键,自动增长)
原文:获取表结构信息(字段名,类型,长度,精度,小数位数,主键,自动增长) 获取表结构的一些简要信息,可以生成自己需要的字典,简单又实用! 以数据表PP_MO为例: SELECT OBJECT_NAME(A.
1340 0