EF Core decimal 類型設置精度

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public class DecimalPrecisionAttribute : Attribute
{
    #region Field
        private byte _precision = 18;
        public byte _scale = 2;
        #endregion

    #region Construct
    /// <summary>
    /// <para>自定義Decimal類型的精確度屬性</para>
    /// </summary>
    /// <param name="precision">precision
    /// <para>精度(默認18)</para></param>
    /// <param name="scale">scale
    /// <para>小數位數(默認2)</para></param>
    public DecimalPrecisionAttribute(byte precision = 18, byte scale = 2)
    {
        Precision = precision;
        Scale = scale;
    }
    #endregion

    #region Property
    /// <summary>
    /// 精確度(默認18)
    /// </summary>
    public byte Precision
    {
        get { return this._precision; }
        set { this._precision = value; }
    }

    /// <summary>
    /// 保留位數(默認2)
    /// </summary>
    public byte Scale
    {
        get { return this._scale; }
        set { this._scale = value; }
    }
    #endregion
}

重寫xxDbContext類 OnModelCreating 方法 

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var item in modelBuilder.Model.GetEntityTypes())
    {
        var type = item.ClrType;
        var props = type.GetProperties().Where(c => c.IsDefined(typeof(DecimalPrecisionAttribute), true)).ToArray();
        foreach (var p in props)
        {
            var precis = p.GetCustomAttribute<DecimalPrecisionAttribute>();
            modelBuilder.Entity(type).Property(p.Name).HasColumnType($"decimal({precis.Precision},{precis.Scale})");
        }
    }
    base.OnModelCreating(modelBuilder);
}

運行 AddMigration 命令生成如下腳本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章