EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。
e.g. 2.1999将会被保存为2.20
网上找到常见的方法为重写DbContext的OnModelCreating方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(x => x.Price).HasPrecision(18, 4);
}
但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。
我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。
e.g.
其中 [DecimalPrecision(18, 4)]即是我们自定义的精度Attribute
具体实现代码如下:
///
/// 自定义Decimal类型的精度属性
///
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]public sealed classDecimalPrecisionAttribute : Attribute
{#region Field
private byte _precision = 18;public byte _scale = 4;#endregion
#region Construct
///
/// 自定义Decimal类型的精确度属性
///
/// precision/// 精度(默认18)
/// scale/// 小数位数(默认4)
public DecimalPrecisionAttribute(byte precision = 18, byte scale = 4)
{
Precision=precision;
Scale=scale;
}#endregion
#region Property
///
///精确度(默认18)///
public bytePrecision
{get { return this._precision; }set { this._precision =value; }
}///
///保留位数(默认4)///
public byteScale
{get { return this._scale; }set { this._scale =value; }
}#endregion}///
///用于modelBuilder全局设置自定义精度属性///
public classDecimalPrecisionAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention{public override voidApply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
{if (attribute.Precision < 1 || attribute.Precision > 38)
{throw new InvalidOperationException("Precision must be between 1 and 38.");
}if (attribute.Scale >attribute.Precision)
{throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
}
configuration.HasPrecision(attribute.Precision, attribute.Scale);
}
}
再在DbContext重写OnModelCreating,添加自定义的DecimalPrecisionAttributeConvention即可以方便地任意添加需要精度控制的字段。
public classProject_DbContext : DbContext
{public Project_DbContext() : base("DefaultConnection") { }protected override voidOnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(newDecimalPrecisionAttributeConvention());base.OnModelCreating(modelBuilder);
}
}
457

被折叠的 条评论
为什么被折叠?



