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