簡體   English   中英

實體框架奇怪 - 一列是錯誤的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM