ToB企服应用市场:ToB评测及商务社交产业平台

标题: EntityFramwork decimal保存到数据库精度只有小数点后两位 [打印本页]

作者: 忿忿的泥巴坨    时间: 2022-8-29 11:16
标题: EntityFramwork decimal保存到数据库精度只有小数点后两位
EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。
如 product.Price=0.0111,存到数据库会变成0.0100
1.解决方案一是网上找到常见的方法为重写DbContext的OnModelCreating方法:
  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {            
  3.   modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(18, 5);
  4. }
复制代码
但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。
2.解决方案二是我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。
调用:

 
其中 [DecimalPrecision(18, 5)]即是我们自定义的精度Attribute
具体实现代码如下:
  1. /// <summary>
  2.      /// <para>自定义Decimal类型的精度属性</para>
  3.      /// </summary>
  4.      [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
  5.      public   class DecimalPrecisionAttribute : Attribute
  6.      {
  7.          #region Field
  8.          private byte _precision = 18;
  9.          public byte _scale = 5;
  10.          #endregion
  11.          #region Construct
  12.          /// <summary>
  13.          /// <para>自定义Decimal类型的精确度属性</para>
  14.          /// </summary>
  15.          /// <param name="precision">precision
  16.          /// <para>精度(默认18)</para></param>
  17.          /// <param name="scale">scale
  18.          /// <para>小数位数(默认5)</para></param>
  19.          public DecimalPrecisionAttribute(byte precision = 18, byte scale = 5)
  20.          {
  21.              Precision = precision;
  22.              Scale = scale;
  23.          }
  24.          #endregion
  25.          
  26.          #region Property
  27.          /// <summary>
  28.          /// 精确度(默认18)
  29.          /// </summary>
  30.          public byte Precision
  31.          {
  32.              get { return this._precision; }
  33.              set { this._precision = value; }
  34.          }
  35.          /// <summary>
  36.          /// 保留位数(默认5)
  37.          /// </summary>
  38.          public byte Scale
  39.          {
  40.              get { return this._scale; }
  41.              set { this._scale = value; }
  42.          }
  43.          #endregion
  44.      }
复制代码
  1.   /// <summary>
  2.     /// 用于modelBuilder全局设置自定义精度属性
  3.     /// </summary>
  4.     public class DecimalPrecisionAttributeConvention
  5.         : PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
  6.     {
  7.         public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
  8.         {
  9.             if (attribute.Precision< 1 || attribute.Precision> 38)
  10.             {
  11.                 throw new InvalidOperationException("Precision must be between 1 and 38.");
  12.             }
  13.             if (attribute.Scale > attribute.Precision)
  14.             {
  15.                 throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
  16.             }
  17.             configuration.HasPrecision(attribute.Precision, attribute.Scale);
  18.         }
  19.     }
复制代码
 
  1.  
复制代码
再在DbContext重写OnModelCreating,添加自定义的DecimalPrecisionAttributeConvention即可以方便地任意添加需要精度控制的字段。
  1.     public class Project_DbContext : DbContext
  2.     {
  3.         public Project_DbContext() : base("DefaultConnection") { }
  4.         protected override void OnModelCreating(DbModelBuilder modelBuilder)
  5.         {
  6.             modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
  7.             base.OnModelCreating(modelBuilder);
  8.         }
  9.     }
复制代码
 
转载于:https://www.cnblogs.com/lonelyxmas/p/9962627.html
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4