EntityFramwork decimal保存到資料庫精度只有小數點後兩位

来源:https://www.cnblogs.com/soyni/archive/2022/07/19/16495167.html
-Advertisement-
Play Games

背景 工作需要配置多個環境,用於 開發Development、預覽Staging、生產Production。 參考文獻: 微軟官方文檔-配置 開始 .NetCore對多環境有很好的支持,預設會讀取appsettings.{Environment}.json。 例如,appsettings.Produ ...


EF中預設的decimal數據精度為兩位數,當我們資料庫設置的精度大於2時,EF將只會保留到2為精度。

如 product.Price=0.0111,存到資料庫會變成0.0100

1.解決方案一是網上找到常見的方法為重寫DbContext的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{            
  modelBuilder.Entity<Product>().Property(x => x.Price).HasPrecision(18, 5);
}

但如果數據表多或者Decimal類型欄位多的話,用OnModelCreating的方法將會變得相當冗餘,而且不便管理。

2.解決方案二是我推薦使用Attribute屬性標簽進行設置,在Entity Model class中decimal的欄位上方直接添加自定義拓展的屬性標簽即可。

調用:

 

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

具體實現代碼如下:

 /// <summary>
     /// <para>自定義Decimal類型的精度屬性</para>
     /// </summary>
     [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
     public   class DecimalPrecisionAttribute : Attribute
     {
 
         #region Field
         private byte _precision = 18;
         public byte _scale = 5;
         #endregion
 
         #region Construct
         /// <summary>
         /// <para>自定義Decimal類型的精確度屬性</para>
         /// </summary>
         /// <param name="precision">precision
         /// <para>精度(預設18)</para></param>
         /// <param name="scale">scale
         /// <para>小數位數(預設5)</para></param>
         public DecimalPrecisionAttribute(byte precision = 18, byte scale = 5)
         {
             Precision = precision;
             Scale = scale;
         } 
         #endregion
         
         #region Property
         /// <summary>
         /// 精確度(預設18)
         /// </summary>
         public byte Precision
         {
             get { return this._precision; }
             set { this._precision = value; }
         }
 
         /// <summary>
         /// 保留位數(預設5)
         /// </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< 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 class Project_DbContext : DbContext
    {
        public Project_DbContext() : base("DefaultConnection") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
            base.OnModelCreating(modelBuilder);
        }

    }

 

轉載於:https://www.cnblogs.com/lonelyxmas/p/9962627.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Day02 第二天主要瞭解的內容為軟體研發的流程,如何使用dos命令框去編譯和運行java程式,以及編寫第一個java程式(HelloWorld) 瞭解編碼格式,Java中的代碼註釋,java如何輸出內容,java中的數據類型以及數據類型的轉換 標識符和關鍵字以及保留字 軟體研發流程 需求調研 需求 ...
  • Intro 對於同樣的數值計算任務,使用numpy比直接編寫python代碼實現 優點: 代碼更簡潔: numpy直接以數組、矩陣為粒度計算並且支持大量的數學函數,而python需要用for迴圈從底層實現; 性能更高效: numpy的數組存儲效率和輸入輸出計算性能,比python使用list好很多, ...
  • 一、 序言 今天用Python來試試,對一個文件裡面的英文單詞數量進行快速統計,告別傳統計數方式。 目標文件 我也不知道多少個,瞎複製的~ 二、涉及知識點 文件讀寫 基礎語法 字元串分割 三、代碼實踐 首先我們創建一個Python文件 導入我們需要用到的模塊 import platform # 我給 ...
  • 前言 嗨嘍~大家好呀,這裡是魔王吶 在前一章:讓我們用python來採集數據看看找工作都要會什麼吧~ 我們講瞭如何採集zhaopin網站數據,現在~ 我們來把數據可視化,更好的查看在自己領域最需的技術是什麼~ 下麵,我們直接上代碼~ 代碼提供者:青燈教育-自游老師 代碼 import pandas ...
  • 1、文件Auto_update_data,需要處理的映射基礎數據 #定義需要導入的映射數據 #以字典進行定義 [公司類目id : 平臺類目id] #d = {key1 : value1, key2 : value2, key3 : value3 } ap_category_relation_data ...
  • Python3的列表推導式、字典推導式、集合推導式和元組推導式,以及相應習題 ...
  • 1 MySQL總體架構介紹 1.1 MySQL總體架構介紹 引言 MySQL是一個關係型資料庫 應用十分廣泛 在學習任何一門知識之前 對其架構有一個概括性的瞭解是非常重要的 比如索引、sql是在哪個地方執行的 流程是什麼樣的 今天我們就先來學習一下MySQL的總體架構 總的來說:MySQL架構是一個 ...
  • 天坑 遇到的問題:使用命令行執行命令:java EightSample,會報以下錯誤 錯誤: 找不到或無法載入主類 EightSample 運行環境 mac系統 IntelliJ IDEA編譯器 Java 1.8 首先保證了Java環境變數和版本都是沒問題的 然後保證已經執行了以下命令,生成了.cl ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...