2011-03-17 27 views
3

實體框架只返回一個值,但該列表的大小是正確的實體框架只返回一個值,但該列表大小是正確

我有沒有主ID的表,我需要獲得或選擇所有值。

我看到的是,當我用linq進行選擇時,對象的數量是正確的,但它是第一行反覆。

我只是在做這樣的事情

List<MyValueType> valuesInDB = myDb.MyValueTypes.ToList(); 

問題是,我可能會得到數千行的(這是正確的),但各行都有相同的確切數據。

我正在使用VS 2010並使用嚮導來創建我的EF對象。

回答

5

問題是實體框架無法在沒有密鑰的情況下使用實體。所以如果你的表沒有指定一個鍵,它自己的entity framework will infer。 EF創建的密鑰由所有不可爲空的非二進制列組成。因此,如果您的實體中只有一個非空的列,它們只有非常小的一組值(如枚舉),您將只能加載「每個值」的單個實體。原因是上下文的內部實現和使用標識映射模式的狀態管理器。從數據庫中檢索數據記錄時,EF將首先檢查實體密鑰並嘗試在其內部存儲中查找具有相同密鑰的對象。如果找到對象,它將使用該對象而不是數據記錄(儘管數據不同)。如果找不到具有該鍵的對象,則會創建一個新對象並將其添加到內部存儲器。

這是識別圖的目的 - 具有給定密鑰的對象應該僅由每個上下文創建一次。身份映射是ORM中的核心模式。

我寫了關於身份地圖也在this question

+0

非常有趣。感謝您的洞察力。 – 2011-03-17 22:51:00

+0

這是一個數據庫,我沒有得到鑰匙。所以這聽起來像是問題。奇怪它會這樣工作。 – Maestro1024 2011-03-18 01:32:14

0

我建議在EDM的designer.cs文件中搜索單詞「Warning」。它可能會告訴你實體框架是否對你的表有任何問題。

在沒有表格設計的情況下,我真的不能評論很多。我試圖複製你的問題,但無法做到這一點。這是我做的:

  1. 創建一個沒有主鍵的表,但它在ID列上有一個唯一鍵。實體框架能夠推斷主鍵,當我提取數據時,我不僅獲得了正確的行數,還糾正了這些行中的數據。
  2. 創建一個沒有主鍵和沒有唯一鍵的表。也沒有稱爲ID的列。實體框架在生成的EDM中排除此表。因此我根本無法查詢此表。這在EDM設計器文件中顯示爲警告。

如果您可以共享表格的創建腳本,那將會更好。