簡體   English   中英

實體框架十進制截斷問題

[英]Entity Framework Decimal Truncation Issue

我正在研究的項目使用Entity Framework 6.0 Code-First。

我的一位同事由於缺乏EF經驗,因此手動將數據庫中字段的字段類型更改為decimal(28,10) ,而不是使用OnModelCreating方法進行正確的DbContext Entity Framework允許他這樣做,以后再也不會出錯。

上周,另一個同事遇到了一個問題,該過程從該表克隆記錄,在該表中,新記錄中的十進制值被截斷為兩位小數位(沒有四舍五入)。

該克隆的代碼類似於以下代碼(使用EF之上的Repository模式):

public void CloneAccounts(List<Account> accounts, int newQuarterID)
{
    var newAccounts = new List<Account>();
    accounts.ForEach(account =>
    {
        var clonedAccount = new Account
        {
            QuarterID = newQuarterID
            AccountName = account.AccountName,
            AccountNumber = account.AccountNumber,
            Amount = account.Amount
        };

        newAccounts.Add(clonedAccount);
    });

    AccountRepository.AddMany(newAccounts);
    AccountRepository.Save();
}

OnModelCreating ,當我指出Amount字段的聲明為decimal(28,10) ,實際上應該在OnModelCreating ,他繼續這樣做,並添加了遷移。 有趣的是,這樣做最終解決了以上代碼的問題。

我的問題有兩個:

  1. 為什么該問題也不會僅在克隆時也不會影響原始記錄的創建?
  2. 為什么在OnModelCreating添加該行OnModelCreating解決該問題?

謝謝!

如果最初沒有設置任何精度,則代碼優先的默認約定是創建精度為18且小數位數為2 (因此只有兩個小數位)的十進制列。 我認為記錄最初可能已被截斷。

同樣,默認情況下,除非您將TruncateDecimalsToScale設置為false,否則SQL Server提供程序的SQL生成器SqlParameter.Scale屬性設置為模型中定義的比例,這會影響數據庫更新和插入。 但是,我不確定那些帶有其他小數位的記錄如何最終存儲在數據庫中。

當使用帶EF的codeFirst時,它將在代碼(C#或VB)中創建模型,然后將模型復制到數據庫中。

為了回答您的問題,我可以這樣說:

  1. 最初,該問題沒有影響,因為在創建模型時,所有更改都直接對數據庫進行,然后您的表與模型中的表完全相同。

請記住,實體框架是一個ORM(對象關系映射器),它為您輕松創建了基於域模型的一組實體(類),該域模型可以以三種不同的方式存在:代碼優先,模型優先,數據庫優先。

  • 代碼優先意味着您可以通過創建一組類(aKa實體)來啟動項目,這些類將在數據庫中表示您的關系模型。 (您的源將是您的類,而目標將是您的數據庫)。

  • “模型優先”意味着您可以使用可視化工具(基本上是拖放,連接點等)來啟動項目,從而可以創建一個模型,該模型將在數據庫中表示您的關系模型。 (您的源將是您的模型,目標是您的數據庫)。

  • 數據庫優先意味着您通過從數據源(通常是數據庫)中選擇模型來啟動項目,這種方法將為您在Visual Studio項目中創建一組類(實體)。 (您的源將是您的數據庫,目標是您的代碼)。

因此,您在上述任何情況下所做的任何更改都必須通過Entity Framework從源復制到目標。

這里發生的是您同事的一個錯誤,他直接在您的數據庫中進行了更改,但這必須是從您的EF項目中完成的(代碼優先)。

當您調用ClonneAccounts時,EF發揮了所有魔力(連接到數據庫,執行查詢,獲取數據,將其強制轉換為您的實體類,然后檢索它們或訪問visceversa)->這是您的應用由於InvalidCastException而崩潰的時候。

  1. EF不會在每次調用ClonneAccounts時檢查表的一致性,方案或結構,它只是在Entities和Database之間檢索數據並插入/更新數據。 如果要更新/檢查一致性並復制更改,則必須手動進行。 這就是為什么直到您在“代碼端”中修復模型並運行該工具后,該工具才能將所有更改復制到您的數據庫。

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM