2012-03-17 7 views
6

Ho una struttura di tabella abbastanza semplice come di seguito e mi sembra strano. Anche se ho scelto di aggirare il problema ma vorrei prendere l'opinione degli esperti.Entity Framework nvarchar Sensibilità del caso su chiave esterna

ho due tabelle

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 

Si prega di notare caso di parcheggi qui è Caps esso è valido per SQL, accetta.

Ora la parte divertente. Ho generato EDMX, .Net 4.0 e ora eseguo questo codice.

using (EFTestEntities context = new EFTestEntities()) 
      { 
       var item = context.Registrations.Where(id => id.Id == 1).FirstOrDefault(); 
       Response.Write(item.User1.LastName); 
      } 

It Just rompe con Null Pointer Exception Utente1 Lanci Null, quando ho cambiare il valore di UserName Colonna nella tabella iscrizioni per un invece di A funziona.

Questo Link parla in qualche modo simile

Questo Link un altro problema simile

Si prega di condividere le tue risposte perché è questo comportamento, fascicolazione del mio DB è case-Coefficiente di disturbo. Hai affrontato simili?

risposta

7

Il problema qui è che il database non fa distinzione tra maiuscole e minuscole, ma CLR (.NET) non lo è e, contrariamente al database, non può essere commutato in modalità maiuscole e minuscole. È necessario farlo per confronto.

Quando chiami item.User1.LastName EF attiva il caricamento lazy - query aggiuntiva viene eseguita nel database per caricare un utente correlato ma quando l'utente è materializzato EF inizierà a correggere e convalidare il suo modello relazionale e qui viene il problema - confronta le stringhe con la distinzione tra maiuscole e minuscole così in base a questa impostazione, a non è uguale a A e, a causa di ciò, l'entità caricata User non è una relazione dell'entità Registration. Di conseguenza EF non aggiusterà la proprietà User1 e rimarrà nullo. L'accesso a LastName in tal caso genererà NullReferenceException.

ci sono solo due soluzioni:

  • riparare il vostro database e assicurarsi che questa differenza caso non apparirà nei dati di nuovo
  • Se sei all'inizio del progetto o se si ha il pieno controllo sul database ridisegnarlo. NVarChar chiavi primarie e chiavi esterne sono design di database non valido.

Se nessuna di queste opzioni è applicabile a te, evitare di utilizzare EF con tale database.

+0

Ho dovuto eseguire il punto 1 poiché a questo punto la modifica del DB non è possibile – Kusek

+0

@ladislav Grazie per la risposta. Questa informazione non è prontamente ovvia, ma sapendo questo mi ha dato l'intuizione necessaria per risolvere il mio problema. Ho dovuto confrontarmi con un database legacy molto sfacciato con diversi casi di PK del caso, su cui non avevo alcun controllo. Fortunatamente sono stato in grado di risolvere il problema utilizzando una vista e facendo 'UPPER ([PrimaryKey])' su entrambe le tabelle offensive per assicurarmi che corrispondessero. Non consiglierei assolutamente questo approccio, ma dovevo farlo per far funzionare il mio programma. – theyetiman