Dot-Net
實體框架 nvarchar 外鍵的大小寫敏感性
我有如下相當簡單的表結構,問題對我來說聽起來很奇怪。雖然我選擇解決它,但想听取專家的意見。
我有兩張桌子
Users UserName nvarchar(250) Primary Key FirstName nvarchar(50) LastName nvarchar(50) Registrations Id BigInt PrimaryKey User nvarchar(250) - Foreign to Users Table Date - DateTime Data I have is as follows. Users UserName FirstName LastName a Small A b Small B Registrations Id User Date 1 A 1/1/12 2 B 1/1/12請注意這裡的使用者案例是大寫,它在 SQL 中有效,它接受。
現在是有趣的部分。我生成了 EDMX、.Net 4.0,現在我執行這段程式碼。
using (EFTestEntities context = new EFTestEntities()) { var item = context.Registrations.Where(id => id.Id == 1).FirstOrDefault(); Response.Write(item.User1.LastName); }它只是因空指針異常 User1 Throws Null 而中斷,當我將 Registrations 表中的 UserName 列的值更改為a而不是A時,它可以工作。
這個連結談到有點相似
這個連結另一個類似的問題
請分享您的答案,為什麼會出現這種行為,我的數據庫排序是不區分大小寫的。你遇到過類似的嗎?
這裡的問題是您的數據庫不區分大小寫,但 CLR (.NET) 不區分大小寫,並且與數據庫相比,它不能全域切換到不區分大小寫模式 - 您必須在每次比較時都這樣做。
當您呼叫
item.User1.LastNameEF 時將觸發延遲載入 - 在數據庫中執行附加查詢以載入相關使用者,但是當使用者物化時,EF 將開始修復和驗證其關係模型,問題就來了 - 它比較區分大小寫的字元串,因此根據此設置a不等於A並且因為您載入的User實體不是您的Registration實體的關係。因此,EF 不會修復User1屬性,它將保持為空。在這種情況下訪問LastName會拋出NullReferenceException.只有兩種解決方案:
- 修復您的數據庫並確保這種大小寫差異不會再次出現在您的數據中
- 如果您處於項目的開始階段,或者您可以完全控制數據庫,請重新設計它。
NVarChar主鍵和外鍵是糟糕的數據庫設計。如果這些選擇都不適合您,則應避免將 EF 與此類數據庫一起使用。