設置EntityFramework中decimal類型數據精度

来源:http://www.cnblogs.com/Ken-Blogs/archive/2017/04/17/6725679.html
-Advertisement-
Play Games

EF中預設的decimal數據精度為兩位數,當我們資料庫設置的精度大於2時,EF將只會保留到2為精度。 網上找到常見的方法為重寫DbContext的OnModelCreating方法: 但如果數據表多或者Decimal類型欄位多的話,用OnModelCreating的方法將會變得相當冗餘,而且不便管 ...


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

    }

 


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

-Advertisement-
Play Games
更多相關文章
  • 介紹: Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYER ...
  • 1.在www.ailiyun.com上下載所需文件以CentOS為例,現將文件下下來 2.兩種掛載方式。 第一種,點旁邊的help文件 按照阿裡的提示完成操作。現將/etc/yum.repos.s/CentOS-Base.repo 備份(相當於更改尾碼名)。 再下載新的CentOS。有可能會提示wg ...
  • 添加命名空間 using System.Xml; 我自己的代碼(添加其中的節點) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("userTable.xml")); XmlNode root = xmlDoc.S ...
  • 2017-04-18 1 public class VisualTargetPresentationSource : PresentationSource 2 { 3 public VisualTargetPresentationSource(HostVisual hostVisual) 4 { 5 ...
  • 上篇博文中我們將模擬設備註冊到Azure IoT Hub中:我們得到了設備的唯一標識。 Azure IoT 技術研究系列2-設備註冊到Azure IoT Hub 本文中我們繼續深入研究,設備到雲、雲到設備通信。 1. 在Azure IoT Hub中接收模擬設備的消息 讀取設備到雲消息的Event H ...
  • 1.excel導入 public override string CheckAndImportFile(ref DataTable errorInfoDataTable) { porgressBar.SetProgress(5, "開始上傳文件到伺服器....."); //上傳文件到伺服器 file ...
  • 初學Xamarin ,各種折騰,大概這公司破電腦配置差,老是很多問題。 GitHub 真是個好東西,可以參考別人做的,不過下載來運行不了就各種折騰了,為此我重裝電腦兩次了,反正win10安裝就十幾分鐘的事。 問題一:沒有為此解決方案配置選中要生成的項目 這個問題的原因懶得找,可能是項目解決方案拷貝的 ...
  • (一)在運行期間處理和檢查代碼 自定義特性允許把自定義元數據與程式元素關聯起來。反射是一個普通術語,它描述了在運行過程中檢查和處理程式元素的功能。例如,反射允許完成的任務: 枚舉類型的成員 實例化新對象 執行對象的成員 查找程式集的信息 檢查應用於某種類型的自定義特性 創建和編譯新程式集 (二)自定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...