[英]Entity Framework oddity - one column is wrong
首先,我已經有一個解決方法,加上正在發生的數據庫正在被替換(全新的db / schema +新應用程序)
話雖如此,我想了解為什么會發生這種情況,所以我不會再遇到它。 我們很感激。
無論如何:采取這個簡單的代碼行:
var privs = _olddb.tbl_Privileges.Where(x => x.UserID == userFrom);
很簡單。 基本上,出現數據的一個例子應該是:
+--------+----------+------------+----------------+------------+
| UserID | RegionID | FacilityID | InitiativeType | AccessType |
+--------+----------+------------+----------------+------------+
| 290 | 27 | 123 | C | F |
| 290 | 27 | 123 | P | F |
| 290 | 27 | 124 | C | F |
| 290 | 27 | 124 | P | F |
+--------+----------+------------+----------------+------------+
相反,雖然......我明白了:
+--------+----------+------------+----------------+------------+
| UserID | RegionID | FacilityID | InitiativeType | AccessType |
+--------+----------+------------+----------------+------------+
| 290 | 27 | 123 | P | F |
| 290 | 27 | 123 | P | F |
| 290 | 27 | 124 | P | F |
| 290 | 27 | 124 | P | F |
+--------+----------+------------+----------------+------------+
注意InitiativeType
列....
但是,如果我運行此命令:
var privs =_olddb.Database.SqlQuery<tbl_Privileges>("SELECT * FROM tbl_Privileges WHERE UserID = " + userFrom);
然后我得到正確的輸出。
是什么賦予了?
-EDIT-關於marc_s提供的答案(請記住,我沒有制作原始數據庫,我害怕修改它,它被一個非常古老的網絡應用程序使用..)我真的覺得愚蠢沒有我在道歉之前檢查過PK。 我檢查了數據庫,該表沒有定義PK。 所以我檢查了EF中的edmx,發現只有RegionID和FacilityID被設置為實體密鑰:
所以我更新了edmx模型並將所有字段設置為鍵(因為我可以在兩個權限集之間輕松地擁有4個字段,因為Access Type也有多個值),再次運行腳本,這次它與林克聲明。
最有可能的是,在源表上定義主鍵是一個問題 - 我在查詢視圖時看到了這種情況(通常沒有預定義的主鍵)。
假設你在UserID, RegionID, FacilityID
桌子上的PK是( UserID, RegionID, FacilityID
)(只是我的猜測,因為它們都被稱為..ID
- 可能是錯誤的)。 當您從SQL Server返回4行時,第一行包含值( 290, 27, 123
)作為主鍵; EF很高興為您創建具有這些值(以及其他非鍵列)的對象實例。
現在是第二行 - 再次,PK值是( 290, 27, 123
),現在EF變為嗯,我之前看到過這些值 - 這必須是同一行,因為按照定義主鍵 必須是唯一的! 因此,EF將添加其創建的第一個對象實例的第二個副本。
所以你需要確保的是你的主鍵 - 實際上在表中的數據庫中定義,或者EF 假設的是視圖的主鍵(默認情況下:所有不可為空的列)對於每一行都是唯一的 -否則你會看到這樣的事情......
這種情況不會發生在你的第二種方法中,你基本上只是執行一個任意的SQL語句 - 在這種情況下,EF將映射每個單獨返回的行,而不檢查它自己的主鍵定義(因為你沒有真正通過你的DbContext
和它的數據庫模型)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.