2013-11-27 33 views
5

我正在考慮使用EF訪問安裝在客戶系統上的傳統SQL Server數據庫。實體框架是否支持模型中的不同數據類型?

問題是數據庫模式不是100%一致的:雖然它們都具有相同的(相關的)表和字段,但某些數字字段可能具有不同的數據類型。

就我所見,從應用程序的角度來看,類型是「兼容的」:例如,一個包含小數字的字段可能是客戶A的數據庫上的smallint,但是客戶B的數據庫上的int或包含價格的字段可能是A的數據庫上的decimal(10,2),而B的數據庫上是float(是的,這意味着B可能遭受損失從浮點問題 - 畢竟這是一個遺留數據庫)。

因爲我們不是唯一訪問數據庫的人,所以更改(並因此統一)模式不是一種選擇。實體框架是否能夠應對這種情況(即,如果模型定義聲明它是decimal(10,2),它會優雅地接受SQL Server表中的double)還是會崩潰?

+0

您是否嘗試過測試:在具有這些差異的幾個測試數據庫中指向相同的模型?記住這些數據可能會有所作爲(例如,小數部分的小數值可能會起作用,而小數部分的小數部分則會失效)。 – Richard

+1

@理查德:還沒有,如果沒有人能提供權威的答案,那就是我計劃要做的事。如果我測試它並且它可以正常工作,我仍然不知道它是否「應該這樣工作」,或者它「由於EF的一些實現細節而巧合工作」。 – Heinzi

+0

確實,「看起來有效」的結果不是確定的(但你也不會在這裏得到)。然而,「它不起作用」的結果將是。因此,您可以提出真正的問題:在這種情況下如何適應/使用EF(因爲不管「官方」職位是什麼,所有可能的映射都會自動支持,因此您需要該問題)。 – Richard

回答

3

如果你看看StackOverflow上你會發現,詢問如何在數據庫中的一個數據類型映射到另一個許多問題:

Short to Bool

'Y'/'N' to true/false

Convert from to string in database to boolean property Entity Framework 4.1

time(0) to DateTime

幾乎總是解決方案是在實體2場,用代碼來執行明確的轉換。

的數據類型的數量很少,使用FluentAPI映射,你可以使用自定義代碼第一公約:

datetime2 to DateTime

smallintint將屬於這一類,但我敢肯定floatdecimal(10, 2)將不會。

由於有多個數據庫使用不同的數據類型,所以我不認爲EF本身會很好地工作。

我能想到的兩件事情,你可以嘗試:

創建每個始終映射數據類型的數據庫視圖,然後反轉從視圖工程師實體框架。您也可能需要map the CUD to stored procedures,然後修改每個數據庫的創建和更新sql以轉換數據類型。

OR

看小巧玲瓏的,你必須在SQL更大的控制權,並做轉換那裏。這個答案有鏈接到存儲庫模式的混合實現 EF + Dapper Hybrid Implementation

0

是實體框架能夠處理那些(即,將它優雅地接受SQL Server表的雙重如果模型定義聲稱它是一個小數(10,2)),還是會崩潰可怕

我認爲這不會引起一個問題,因爲實體框架在執行查詢之前進行所有的轉換,並且由於沒有從浮點到十進制的隱式轉換,您應該在編譯時檢測它並進行顯式轉換。

相關問題