2011-03-17 67 views
0

我有一個映射到表EntityTable的實體,非常簡單,由大約4或5個值類型屬性組成。但是,根據我訪問的數據庫,對於其中一個屬性,模式是不同的:在大多數模式中,它是一個decimal,在其他幾個中,它是一個smallint(或在C#中的Int16)。很明顯,當EF試圖將Int16值映射到預期爲decimal型特性的實體時,它會跳過EF。實體框架4 ExecuteStoreQuery <T> - 無法獲得對象類型屬性

所以我的解決辦法是要求ExecuteStoreQuery()的EF上下文和有FauxEntity聲明靠不住的屬性作爲object並沒有明確decimalInt16。然後,我可以專門處理手動拆箱。

但是,這是行不通的!物業的價值是null而不是對盒裝Int16(或decimal價值)的對象引用!這是奇怪,因爲我可以很容易地聲明是這樣的:那麼

object intVal = 16; 

intVal將成爲盒裝int值的一個實例。然後我可以適當地取消選擇。

這就是我對ExecuteStoredProcedure的期望 - 它應該將值拋入對象屬性中,然後我可以執行一系列拆箱測試來正確解開該值。但是,價值永遠不會成功裝箱在object屬性!

這是甚至可能與ExecuteStoreQuery<T>()?爲什麼它不能將值類型加載到object-type屬性中?

順便說一句,我知道我可以通過對SQL代碼執行DataReader並手動鑄造每個結果列來解決手頭上的問題。我只是想知道爲什麼ExecuteStoreQuery<T>()不符合預期。

回答

3

restrictions on TElement在MSDN中。引用:

對於採用通用結果類型參數的以前方法,TResult可以是基元類型,實體類型或任何自定義類型。該類型不必在實體框架概念模型中定義。如果指定類型的類型未在概念模型中定義,或者不是基本類型,則應用以下映射約定。

類型:

  • 一定不能是抽象的。
  • 必須有一個默認的構造函數。

類型的每個屬性:

  • 必須有一個二傳手。
  • 必須對應於CSDL中的基元類型。
  • 必須與生成的DbDataReader中的列名相對應(提供者實現確定列是否與該屬性具有相同的名稱)。如果類型屬性的名稱與DbDataReader的字段不匹配,則實體框架將在屬性模型中定義該屬性的默認值。
+1

所以它看起來像第二個項目符合性能要求是什麼讓我絆倒。 '對象'肯定不是原始類型。唉。感謝Craig在MSDN中進行挖掘,我明顯錯過了! – kdawg 2011-03-17 21:30:39