2013-08-07 67 views
0

我正在編寫一個.NET Web應用程序在現有數據庫應用程序(SQL服務器)之上。最初的開發者在float列中存儲貨幣,而不是moneydecimal。我真的想在我的POCO中使用Decimal(尤其是因爲我會在得到它們之後對值進行進一步操作)。我可以將十進制屬性映射到浮點數據列

不幸的是,我不能碰的DB模式。有沒有一種方法仍沿用在我的波蘇斯Decimal,並告訴EF「這沒關係,我知道decimalfloat沒有相處。我也不喜歡。還是做你最好的。」

由於沒有特殊的配置,我得到這個錯誤:

The specified cast from a materialized 'System.Double' type to the 'System.Decimal' type is not valid.

我使用modelBuilder.Entity(Of myPocoType).Property(Function(x) x.MoneyProperty).HasColumnType("float")試過了,但讓我這個錯誤:

Schema specified is not valid. Errors: 
(195,6) : error 0063: Precision facet isn't allowed for properties of type float. 
(195,6) : error 0063: Scale facet isn't allowed for properties of type float. 
+0

的可能重複[可在C#實體框架代碼優先地圖彩車是在SQL Server小數(http://stackoverflow.com/questions/14221227/can-entity-framework-code-first-map-floats- in-c-sharp-be-to-decimals-in-sql-serv) –

+1

如何使用視圖來避免醜陋的解決方法? – OzrenTkalcecKrznaric

+0

@OzrenTkalčecKrznarić我對數據庫擁有隻讀訪問權限。其中有很多數據,他們不希望我的更改「意外」破壞任何內容。 –

回答

1

像這樣的工作:

public class MyPocoType 
{ 
    public float FloatProp { get; set; } 

    [NotMapped] 
    public decimal DecimalProp 
    { 
     get 
     { 
      return (decimal)FloatProp; 
     } 
     set 
     { 
      FloatProp = (float)value; 
     } 
    } 
} 

EF會忽略decimal之一,但你可以用它它會設置底層的float。您可以添加自己的邏輯來處理精度的損失,如果您有任何特殊的要求,您可能需要找出值超出轉換範圍的情況(float有更大的範圍,但是decimal具有更高的精度)。

這不是一個完美的解決方案,但如果你堅持float當時的它不會得到更好的。一個float本質上有點模糊,所以這會讓你絆倒你的某個地方。

如果你真的想變得複雜,你可以考慮在內部保留十進制值,然後使用保存時發生的各種事件(重寫SaveChanges()中的某些邏輯,或者捕獲SavingChanges事件)轉換爲以減少轉換錯誤的積累。

+1

我希望避免使用商店特有的屬性來混亂我的POCO。在'DbContext'中完全沒有辦法完成這個任務? –

+0

我想你可以重寫一些方法,這樣當你檢索這些對象時,你可以從它們中取出這些值,並創建具有'decimal'屬性的對象的實例,然後在保存時做相反的操作。取決於數據訪問層的結構,這可能不是微不足道的,需要在很多地方進行更改。我的建議是:重構你的數據訪問總是通過一個方法,每個方法(可能是'設置()'讀書的時候'設置()。新增()'保存時),然後你可以保持你的'float' /'十進制「轉換邏輯限於這兩個。有點醜,但它應該工作。 – anaximander