![](/img/trans.png)
[英]Truncation Occurs on System.Decimal to Oracle's Float when using Entity Framework 5 to Oracle 11g/12c
[英]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
,他繼續這樣做,並添加了遷移。 有趣的是,這樣做最終解決了以上代碼的問題。
我的問題有兩個:
OnModelCreating
添加該行OnModelCreating
解決該問題? 謝謝!
如果最初沒有設置任何精度,則代碼優先的默認約定是創建精度為18且小數位數為2 (因此只有兩個小數位)的十進制列。 我認為記錄最初可能已被截斷。
同樣,默認情況下,除非您將TruncateDecimalsToScale設置為false,否則SQL Server提供程序的SQL生成器SqlParameter.Scale
屬性設置為模型中定義的比例,這會影響數據庫更新和插入。 但是,我不確定那些帶有其他小數位的記錄如何最終存儲在數據庫中。
當使用帶EF的codeFirst時,它將在代碼(C#或VB)中創建模型,然后將模型復制到數據庫中。
為了回答您的問題,我可以這樣說:
請記住,實體框架是一個ORM(對象關系映射器),它為您輕松創建了基於域模型的一組實體(類),該域模型可以以三種不同的方式存在:代碼優先,模型優先,數據庫優先。
代碼優先意味着您可以通過創建一組類(aKa實體)來啟動項目,這些類將在數據庫中表示您的關系模型。 (您的源將是您的類,而目標將是您的數據庫)。
“模型優先”意味着您可以使用可視化工具(基本上是拖放,連接點等)來啟動項目,從而可以創建一個模型,該模型將在數據庫中表示您的關系模型。 (您的源將是您的模型,目標是您的數據庫)。
數據庫優先意味着您通過從數據源(通常是數據庫)中選擇模型來啟動項目,這種方法將為您在Visual Studio項目中創建一組類(實體)。 (您的源將是您的數據庫,目標是您的代碼)。
因此,您在上述任何情況下所做的任何更改都必須通過Entity Framework從源復制到目標。
這里發生的是您同事的一個錯誤,他直接在您的數據庫中進行了更改,但這必須是從您的EF項目中完成的(代碼優先)。
當您調用ClonneAccounts時,EF發揮了所有魔力(連接到數據庫,執行查詢,獲取數據,將其強制轉換為您的實體類,然后檢索它們或訪問visceversa)->這是您的應用由於InvalidCastException而崩潰的時候。
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.