EF關於decimal精度的問題


在.NET EF當中,當我們使用Decimal類型存儲到數據庫時,EF會默認將精度確認為2位,對於一些應用來說,2位並不足夠,於是EF提供了一種方式去調整精度

    public class DB : DbContext
    {
        public DB()
            : base("name=SqlConnString")
        {}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {modelBuilder.Entity<Sku>().Property(p=>p.Weight).HasPrecision(18,3);
}
}

重載OnModelCreating方法,在里面設置Property中的Precision屬性。

這種方法可以滿足絕大部分的需求,但若是多次出現精度調整的問題,這種寫法顯然不適合,於是這邊利用的特性去做批量處理

    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public class DecimalPrecisionAttribute : System.Attribute
    {
        public byte Precision = 18;
        public byte Scale = 2;

        public DecimalPrecisionAttribute(byte precision = 18, byte scale = 2)
        {
            Precision = precision;
            Scale = scale;
            if (Precision < 1 || Precision > 38)
            {
                throw new AlertException("精度必須在1和38之間.");
            }
            if (Scale < 1 || Scale > 38)
            {
                throw new AlertException("刻度必須在1和38之間.");
            }
        }
    }

然后在屬性上添加特性

        [DecimalPrecision(18, 3)]
        public decimal UsableQty { get; set; }

最后在重載OnModelCreating方法

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties().Where(p => p.GetCustomAttributes(typeof(DecimalPrecisionAttribute),false).OfType<DecimalPrecisionAttribute>().Any())
                .Configure(m => m.HasPrecision(m.ClrPropertyInfo.GetCustomAttributes(false).OfType<DecimalPrecisionAttribute>().First().Precision,
                    m.ClrPropertyInfo.GetCustomAttributes(typeof(DecimalPrecisionAttribute), false).OfType<DecimalPrecisionAttribute>().First().Scale));
            modelBuilder.Properties().Configure(ConfigurationAction);
            base.OnModelCreating(modelBuilder);
        }

其中,Configure里面可以配置很多東西。

網上對於特性還有另外一種方法去處理,但是不知道為什么,那種方法會動態生成32位的dll,如果iis設置為64位的話,不重新設置一下會報錯,所有選擇這種方式去處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM