decimal类型 go_设置EntityFramework中decimal类型数据精度

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值