• 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位的话,不重新设置一下会报错,所有选择这种方式去处理

  • 相关阅读:
    又肝了3天,整理了80个Python DateTime 例子,必须收藏!
    frida hook js 如何遍历输出map
    【MySQL实战】 01 | 基础架构:一条SQL查询语句是如何执行的?
    【开发笔记】 mysql把A表数据插入到B表数据的几种方法
    C#多线程(入门篇)
    C#多线程(浅谈线程安全)
    内存管理
    Mac 安装HbuilderX运行unapp 遇到的错误Error: Cannot find module 'copywebpackplugin'
    xml转voc数据集(含分享数据集)
    使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)
  • 原文地址:https://www.cnblogs.com/lhll/p/6902216.html
Copyright © 2020-2023  润新知