EF (ef core,core first)设置decimal字段精度

1、网上的方法

[Column(TypeName = "decimal(18,2)")]
public decimal Money { get; set; }

 

以上经测试不管用 不知道是不是我配置的问题

2、DbContext重写OnModelCreating 经测试还是不管用 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().Property(t => t.UnitPrice)
        .HasColumnName("UnitPrice")
        .HasPrecision(18, 2);
}

在以上方法加上base.OnModelCreating(modelBuilder);经测试好用

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {

        modelBuilder.Entity<Product>().Property(t => t.UnitPrice) .HasColumnName("UnitPrice") .HasPrecision(18, 2);
         base.OnModelCreating(modelBuilder);
 }

3、DbContext重写OnModelCreating 另一种方式 经测试还是不管用 

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
       base.OnModelCreating(modelBuilder);
       modelBuilder.Entity<PayPay>().Property(p => p.Money).HasColumnType("decimal(18,2)");
 }

 

4、网上推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。经测试不管用 可能我配置的问题 如有测试成功的请多多指导

e.g.

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

具体实现代码如下:

复制代码

     /// <summary>
     /// <para>自定义Decimal类型的精度属性</para>
     /// </summary>
      [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
      public sealed class DecimalPrecisionAttribute : Attribute
      {
  
          #region Field
          private byte _precision = 18;
         public byte _scale = 4;
         #endregion
 
         #region Construct
         /// <summary>
         /// <para>自定义Decimal类型的精确度属性</para>
         /// </summary>
         /// <param name="precision">precision
         /// <para>精度(默认18)</para></param>
         /// <param name="scale">scale
         /// <para>小数位数(默认4)</para></param>
         public DecimalPrecisionAttribute(byte precision = 18, byte scale = 4)
         {
             Precision = precision;
             Scale = scale;
         } 
         #endregion
         
         #region Property
         /// <summary>
         /// 精确度(默认18)
         /// </summary>
         public byte Precision
         {
             get { return this._precision; }
             set { this._precision = value; }
         }
 
         /// <summary>
         /// 保留位数(默认4)
         /// </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);
        }

    }

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值