EF关于decimal精度的问题

Posted 无心风雨的落叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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位的话,不重新设置一下会报错,所有选择这种方式去处理

以上是关于EF关于decimal精度的问题的主要内容,如果未能解决你的问题,请参考以下文章

EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改

计算 System.Decimal 精度和比例

go使用decimal

spark遇到的decimal精度缺失的问题

float精度丢失问题解决,用decimal.Decimal

EF DataFirst修改数据类型