地球EF关于decimal精度的问题
在 EF当中,当我们使⽤Decimal类型存储到数据库时,EF会默认将精度确认为2位,对于⼀些应⽤来说,2位并不⾜够,于是EF提供了⼀种⽅式去调整精度
public class DB : DbContext
{
public DB()
: ba("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 = fal, AllowMultiple = fal)]
public class DecimalPrecisionAttribute : System.Attribute
{
public byte Precision = 18;dnf暗帝
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; t; }
最后在重载OnModelCreating⽅法
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties().Where(p => p.GetCustomAttributes(typeof(DecimalPrecisionAttribute),fal).OfType<DecimalPrecisionAttribute>().Any())
.Configure(m => m.HasPrecision(m.ClrPropertyInfo.GetCustomAttributes(fal).OfType<DecimalPrecisionAttribute>().First().Precision,
m.ClrPropertyInfo.GetCustomAttributes(typeof(DecimalPrecisionAttribute), fal).OfType<DecimalPrecisionAttribute>().First().Scale));
modelBuilder.Properties().Configure(ConfigurationAction);
九开头成语
ba.OnModelCreating(modelBuilder);
}
其中,Configure⾥⾯可以配置很多东西。
⽹上对于特性还有另外⼀种⽅法去处理,但是不知道为什么,那种⽅法会动态⽣成32位的dll,如果iis设置为64位的话,不重新设置⼀下会报错,所有选择这种⽅式去处理