设置EntityFramework中decimal类型数据精度
2024-10-01 02:45:38
EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。
e.g. 2.1999将会被保存为2.20
网上找到常见的方法为重写DbContext的OnModelCreating方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(18, 4);
}
但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。
我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。
e.g.
其中 [DecimalPrecision(18, 4)]即是我们自定义的精度Attribute
具体实现代码如下:
/// <summary>
/// <para>自定义Decimal类型的精度属性</para>
/// </summary>
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class DecimalPrecisionAttribute : Attribute
{ #region Field
private byte _precision = ;
public byte _scale = ;
#endregion #region Construct
/// <summary>
/// <para>自定义Decimal类型的精确度属性</para>
/// </summary>
/// <param name="precision">precision
/// <para>精度(默认18)</para></param>
/// <param name="scale">scale
/// <para>小数位数(默认4)</para></param>
public DecimalPrecisionAttribute(byte precision = , byte scale = )
{
Precision = precision;
Scale = scale;
}
#endregion #region Property
/// <summary>
/// 精确度(默认18)
/// </summary>
public byte Precision
{
get { return this._precision; }
set { this._precision = value; }
} /// <summary>
/// 保留位数(默认4)
/// </summary>
public byte Scale
{
get { return this._scale; }
set { this._scale = value; }
}
#endregion
} /// <summary>
/// 用于modelBuilder全局设置自定义精度属性
/// </summary>
public class DecimalPrecisionAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
{
if (attribute.Precision < || attribute.Precision > )
{
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 class Project_DbContext : DbContext
{
public Project_DbContext() : base("DefaultConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
base.OnModelCreating(modelBuilder);
} }
最新文章
- Android零碎知识
- 主机巡检脚本:OSWatcher.sh
- [WPF系列]-参考文献
- Java并发编程核心方法与框架-Executors的使用
- 如何做好App的引导页?(转)
- c++ 迭代器库
- SQLserver2012 修改数据库架构
- bootstrap bootstrapTable 隐藏列
- c# List<;int>; 转 string 以及 string [] 转 List<;int>;
- 百度编辑器1.4.3 .net版在vs2008的使用方法
- Android经常使用的五种弹出对话框
- 邻里街坊 golang入坑系列
- JS 的骚操作
- js 时间动画优化
- A1036. Boys vs Girls
- java判断字符串中是否包含中文 过滤中文
- SqlServerDBCC SHRINKFILE不起作用
- 用Docker下搭建GitLab
- TFS分布式文件系统
- js 俄罗斯方块源码,简单易懂
热门文章
- Android模糊演示样例-RenderScript-附效果图与代码
- database工具
- rails引入bootstrap
- 解决Eclipse下不自动拷贝apk到模拟器问题( The connection to adb is down, and a severe error has occured)
- ios开发杂项(基础性介绍等)
- GObject对象系统
- C++ STL中Map的按Value排序
- Nunit2.5.10快速上手(笔记)
- CentOS下febootstrap自制Docker的CentOS6.6和7.1 Docker镜像
- jquery mobile 的loading提示“正在加载...”在不同版本中的不同实现方式