原文:设置EntityFramework中decimal类型数据精度

EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度。

  1. e.g. .19990将会被保存为2.

1.解决方案一是网上找到常见的方法为重写DbContext的OnModelCreating方法:

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {
  3.   modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(, );
  4. }

但如果数据表多或者Decimal类型字段多的话,用OnModelCreating的方法将会变得相当冗余,而且不便管理。

2.解决方案二是我推荐使用Attribute属性标签进行设置,在Entity Model class中decimal的字段上方直接添加自定义拓展的属性标签即可。

调用:

其中 [DecimalPrecision(18, 5)]即是我们自定义的精度Attribute

具体实现代码如下:

  1. /// <summary>
  2. /// <para>自定义Decimal类型的精度属性</para>
  3. /// </summary>
  4. [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
  5. public class DecimalPrecisionAttribute : Attribute
  6. {
  7.  
  8. #region Field
  9. private byte _precision = 18;
  10. public byte _scale = 5;
  11. #endregion
  12.  
  13. #region Construct
  14. /// <summary>
  15. /// <para>自定义Decimal类型的精确度属性</para>
  16. /// </summary>
  17. /// <param name="precision">precision
  18. /// <para>精度(默认18)</para></param>
  19. /// <param name="scale">scale
  20. /// <para>小数位数(默认5)</para></param>
  21. public DecimalPrecisionAttribute(byte precision = 18, byte scale = 5)
  22. {
  23. Precision = precision;
  24. Scale = scale;
  25. }
  26. #endregion
  27.  
  28. #region Property
  29. /// <summary>
  30. /// 精确度(默认18)
  31. /// </summary>
  32. public byte Precision
  33. {
  34. get { return this._precision; }
  35. set { this._precision = value; }
  36. }
  37.  
  38. /// <summary>
  39. /// 保留位数(默认5)
  40. /// </summary>
  41. public byte Scale
  42. {
  43. get { return this._scale; }
  44. set { this._scale = value; }
  45. }
  46. #endregion
  47. }
  1. /// <summary>
  2. /// 用于modelBuilder全局设置自定义精度属性
  3. /// </summary>
  4. public class DecimalPrecisionAttributeConvention
  5. : PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
  6. {
  7. public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
  8. {
  9. if (attribute.Precision< 1 || attribute.Precision> 38)
  10. {
  11. throw new InvalidOperationException("Precision must be between 1 and 38.");
  12. }
  13. if (attribute.Scale > attribute.Precision)
  14. {
  15. throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
  16. }
  17. configuration.HasPrecision(attribute.Precision, attribute.Scale);
  18. }
  19. }
  1.  

再在DbContext重写OnModelCreating,添加自定义的DecimalPrecisionAttributeConvention即可以方便地任意添加需要精度控制的字段。

  1. public class Project_DbContext : DbContext
  2. {
  3. public Project_DbContext() : base("DefaultConnection") { }
  4.  
  5. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  6. {
  7. modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
  8. base.OnModelCreating(modelBuilder);
  9. }
  10.  
  11. }

设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)的更多相关文章

  1. 设置EntityFramework中decimal类型数据精度

    EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度. e.g. 2.1999将会被保存为2.20 网上找到常见的方法为重写DbContext的OnMo ...

  2. entityFramework 中decimal精度缺失问题

    在entityFramework中,decimal精度默认为2位数,当要设置的精度大于2位并且数据库中设置的decimal精度大于2位时,则将数据保存在数据库中后两位的小数内容将强制为00 解决方案: ...

  3. Http:设置 浏览器中MIME 类型

    http://www.163ns.com/zixun/post/4602.html 自定义MIME类型支持FLV的相关设置 网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟 ...

  4. ASP.Net Core中设置JSON中DateTime类型的格式化(解决时间返回T格式)

    最近项目有个新同事,每个API接口里返回的时间格式中都带T如:[2019-06-06T10:59:51.1860128+08:00],其实这个主要是ASP.Net Core自带时间格式列化时间格式设置 ...

  5. MySQL中的float和decimal类型有什么区别

    decimal 类型可以精确地表示非常大或非常精确的小数.大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性.该类型对于必须避免舍入错误的应用程序( ...

  6. [C#学习笔记]C#中的decimal类型——《CLR via C#》

    System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...

  7. Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作

    Oracle 远程访问配置   服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...

  8. 【转载】 C#中float、double以及decimal类型有何不同

    在C#语言中,float.double以及decimal类型都可以用来表示小数,但三者还是有一定的不同,有效数字为相比的话,decimal类型的有效数字最大,float类型最小.计算浮点类型的运算,如 ...

  9. 【转载】 C#中使用decimal.Parse方法将字符串转换为十进制decimal类型

    在C#编程过程中,很多时候涉及到数据类型的转换,例如将字符串类型的变量转换为十进制decimal类型就是一个常见的类型转换操作,decimal.Parse方法是C#中专门用来将字符串转换为decima ...

随机推荐

  1. 【洛谷P1962】斐波那契数列

    斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...

  2. ES6初识-Proxy和Reflect

    { let obj={ time:'2017-03-11', name:'net', _r:123 };   let monitor=new Proxy(obj,{ // 拦截对象属性的读取 get( ...

  3. datatable行内内容太长,有时不自动换行解决方法

    加一个css属性即可 style = "word-wrap:break-word;" js代码: "render": function (data, type, ...

  4. html基础之遗忘篇

    a链接: ①a的href指向压缩文件可以下载压缩文件. ②a链接的打开方式可以在head内使用<base target="_blank">来整体控制打开方式. 字符实体 ...

  5. http协议组成(请求状态码)

    http请求由:请求行:消息报头:请求正文组成 //请求行 Request URL: http://172.32.4.33:8080/operation/v2/autoServer/queryAuto ...

  6. 学习Pytbon第十八篇,异常处理

    什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...

  7. 学习python第十四天,模块

    Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...

  8. R-描述性统计

    RT...老实说这一章我是抖的...但是,加油- # 从1:100中均匀抽取size个数据,replace=TRUE指有放回抽样,数据可以重复 x = sample(1:100, size = 100 ...

  9. 华为ensp工具栏丢失解决方法

    电脑是win8系统 不知道什么原因,华为模拟器的工具栏神奇的消失了,感觉很郁闷,每次要写字的时候都找不到在哪里(菜单里也没有),于是在官方论坛里面找了一下终于找出原因了. 关闭ensp,点击属性,进入 ...

  10. Android stadio butternife工具

    http://www.androidchina.net/5068.html svn今天我对它有了更深的认识.我知道了有冲突了不能提交.但是可以update,updata之后就会有冲突的东西生成,如果你 ...