在.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位的話,不重新設置一下會報錯,所有選擇這種方式去處理