设置EntityFramework中decimal类型数据精度

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

具体实现代码如下:

 1     /// <summary>
 2     /// <para>自定义Decimal类型的精度属性</para>
 3     /// </summary>
 4     [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
 5     public sealed class DecimalPrecisionAttribute : Attribute
 6     {
 7
 8         #region Field
 9         private byte _precision = 18;
10         public byte _scale = 4;
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>小数位数(默认4)</para></param>
21         public DecimalPrecisionAttribute(byte precision = 18, byte scale = 4)
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         /// 保留位数(默认4)
40         /// </summary>
41         public byte Scale
42         {
43             get { return this._scale; }
44             set { this._scale = value; }
45         }
46         #endregion
47     }
48
49     /// <summary>
50     /// 用于modelBuilder全局设置自定义精度属性
51     /// </summary>
52     public class DecimalPrecisionAttributeConvention
53         : PrimitivePropertyAttributeConfigurationConvention<DecimalPrecisionAttribute>
54     {
55         public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DecimalPrecisionAttribute attribute)
56         {
57             if (attribute.Precision < 1 || attribute.Precision > 38)
58             {
59                 throw new InvalidOperationException("Precision must be between 1 and 38.");
60             }
61             if (attribute.Scale > attribute.Precision)
62             {
63                 throw new InvalidOperationException("Scale must be between 0 and the Precision value.");
64             }
65             configuration.HasPrecision(attribute.Precision, attribute.Scale);
66         }
67     }

再在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);
        }

    }
时间: 2024-10-11 05:07:07

设置EntityFramework中decimal类型数据精度的相关文章

设置EntityFramework中decimal类型数据精度问题(EF默认将只会保留到2为精度)

原文:设置EntityFramework中decimal类型数据精度 EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度. e.g. 2.19990将会被保存为2.20 1.解决方案一是网上找到常见的方法为重写DbContext的OnModelCreating方法: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<

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

最近项目有个新同事,每个API接口里返回的时间格式中都带T如:[2019-06-06T10:59:51.1860128+08:00],其实这个主要是ASP.Net Core自带时间格式列化时间格式设置的,我们只需要替换序格式化时间格式就可以: 一.先建一个控制器测试: public IActionResult Get() { UserInfo userInfo = new UserInfo() { Name = "lxsh", BirthDay = DateTime.Now }; re

Entity Framework 中Decimal字段长度设置方法

在创建项目DbContext时,重写DbContext.OnModelCreating()方法:然后通过如下方法指定精度 1 protected override void OnModelCreating(DbModelBuilder modelBuilder) 2 { 3 modelBuilder.Entity<Product>().Property(product => product.Price).HasPrecision(18, 12); 4 } Entity Framework

EntityFramework中支持BulkInsert扩展

很显然,你应该不至于使用 EntityFramework 直接插入 10W 数据到数据库中,那可能得用上个几分钟.EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务. 但是,如果已经在项目中使用了 EntityFramework,如果碰到需要直接向数据库中插入 10W 的数据的需求,引入 ADO.NET 和 SqlBulkCopy 的组合将打破 EntityFramework 作为 ORM 所带来的优势,我们

EntityFramework中出现DateTime2异常的完美解决办法

今天在使用entityframework往数据库插入数据的时候,突然出现了一个数据类型转换异常的问题: System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值. 查了一下网上的资料,很多人给了原因与解决办法: C#中的DateTime类型比SqlServer中的datetime范围大.SqlServer的datetime有效范围是1753年1月1日到9999年12月31日,如果超出这个范围,

解决 Entity Framework 6.0 decimal 类型精度问题

?  前言 本文主要解决 EF 中对于 MSSQL 数据库的 decimal 类型经度问题,经实验该问题仅在 CodeFirst 模式的情况下发生,话不多说直接看代码. 1.   假设我们有一张 Customer 数据表,主要探究:Longitude.Latitude.LonLatSum 这三个字段. 1)   结构如下: CREATE TABLE dbo.Customer ( Id int NOT NULL,                            --客户Id Name nva

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

SqlServer中decimal(numeric )、float 和 real 数据类型的区别[转]

decimal(numeric )             同义,用于精确存储数值 float 和 real                      不能精确存储数值   decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法:不存储值的近似值. 定义 decimal 的列.变量和参数的两种特性如下: p   小数点左边和右边数字之和,不包括小数点.如 123.45,则 p=5,s=2. 指定精度或对象能够控

C#中值类型和引用类型

本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数据类型(string类型除外):包括整型.浮点型.十进制型.布尔型. 整型(sbyte.byte.char.short.ushort.int.uint.long.ulong ) 浮点型(float 和 double ) 十进制型(decimal ) 布尔型(bool ) 结构类型(struct) 枚