Dot-Net

實體框架 nvarchar 外鍵的大小寫敏感性

  • March 30, 2019

我有如下相當簡單的表結構,問題對我來說聽起來很奇怪。雖然我選擇解決它,但想听取專家的意見。

我有兩張桌子

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 與此類數據庫一起使用。

引用自:https://stackoverflow.com/questions/9751647