2009-09-29 43 views
10

使用VS 2008,SQL Server 2008和WPF 3.5,我對模式進行了一些更改並更新了模型。它編譯並運行正常,直到客戶端應用程序調用特定的實體,我得到以下(代替實際的名稱):數據讀取器不兼容...成員在數據讀取器中沒有相應的列

The data reader is incompatible with the specified '<Model>.<ViewBasedEntity>'. A member of the type, '<Property>', does not have a corresponding column in the data reader with the same name. 

我已經通過服務應用程序相關實體和屬性名稱搜索,試圖重新命名在表格地圖中的屬性,似乎是一些其他報告相同的錯誤,但似乎無法找到及時的答案....

...有誰知道如何跟蹤這個下來,如果是這樣,是否有一種解決方法或方法可以在未來避免?

+0

我的問題是,我有(0)之前,我的SELECT語句....回報。顯然,它並沒有返回EF期望的列。 – 2013-10-11 08:52:43

回答

2

請檢查this博客文章。查看Divan Moller的第一條評論。可能對你有幫助。

+0

謝謝Mahin - 在這種情況下,名稱是完全相同的。在下一個關於該鏈接的評論之後,也許有人可以查閱上面提到的實體框架聖經的第13章 - 我沒有副本。 – erinql

4

好 - 這裏的消息:

該特定視圖是設置爲一個存儲過程,必須是建立在模型的實體容器函數導入返回類型。

我已更新該視圖以符合新的報告要求,但並未意識到它對功能導入的重要性。附加字段不是爲此目的而識別的數據集的一部分,因此無法爲其中任何一個匹配。

所以我複製了視圖,並在後面添加了「報告」,然後將原始圖像恢復爲期望的返回字段集。

瞧!

+0

我有類似的問題,然後看到提到'存儲過程'提醒我是什麼原因。 –

12

,而不是更新的觀點,你也可以更新功能導入:

  • 轉到模型瀏覽器窗口
  • 展開和EntityContainer
  • 打開的映射詳細信息窗口功能導入
  • 如果實體名稱(左列)與期望的字段名稱(右列)不匹配,則可以更改右列以匹配實際調用的返回字段。
+0

非常感謝,這對我有幫助。 –

5

我有一個類似的問題,它產生了相同的錯誤信息 - 問題是proc返回的列名包含空格。

創建複雜類型時,[my column]創建爲my_column

然後執行proc時ExecuteStoreQuerymy_column在數據讀取器中不存在,因爲proc仍返回[my column]

解決方案:從proc列名移除空格併爲導入的函數重新創建複雜類型。

1

我最近在使用Sprocs時遇到了同樣的問題。我曾在存儲過程的一些conditonal SQL沿一對夫婦的線「如果」語句

IF @param1 = 'knownValue' 
BEGIN 
SELECT * FROM EntityType WHERE ID = 'somevalue' 
END 
ELSE IF @param1 = 'knownValue2' 
BEGIN 
SELECT * FROM EntityType WHERE ID = 'somevalue' 
END 

這裏是我的EF代碼:

return context.Database.SqlQuery<EntityType>(
      "[NAV].[GeEntityType] @Date, @ID", 
      new SqlParameter("Date", paramDate), 
      new SqlParameter("ID", paramId)).ToList(); 

我沒有照顧場景中沒有「如果」語句返回true,所以sproc甚至沒有返回一個空的結果集並導致EF拋出這個錯誤。在沒有返回空白閱讀器的情況下,EF在將列映射到屬性時沒有任何匹配。

希望它有幫助。

+0

santos的答案爲我工作:「該sproc甚至沒有返回一個空的結果集」 – beaudetious

+0

所以真的 即使我面臨同樣的問題。我已經考慮過所有的情況,但忽視了引發這個問題的其他最終案例。閱讀這篇文章後,我已經包括最終的其他案例,問題解決了。 –

2

我看到這種情況發生在改變結果集的數據對象上(例如帶有if語句的sproc)錯誤消息是實體框架工作/數據讀取器告訴您它期望列x並且它沒有被返回。

若要解決此您可以 一)確保您的存儲過程的所有路徑返回相同的列名 B)使用Database.ExecuteSqlCommand

0

簡單的辦法:

  1. 一旦SP完成更新EF模型,以便可用。
  2. 將SPINT語句添加到SP,重新編譯並運行。
  3. 註釋掉動態SQL並放入PRINT語句中,重新編譯確保它運行。
  4. 現在在EF功能導入,列會顯示。
  5. 更改SP返回動態代碼和所有好的:)
相關問題