24

Sono piuttosto nuovo nel mondo ASP .NET MVC. Forse, questa è la ragione per cui non riesco a spiegarmi la causa di quello che è, per me, un problema fastidioso.Perché Entity Framework restituisce l'elenco null <> invece di quelli vuoti?

Ho una lezione con uno-a-molti rapporti.

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

Quando sto persistente un'istanza di questa classe, lo riempio di rapporto con un elenco vuoto <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 

Il problema è che, quando cerco di recuperare tale istanza, e per qualsiasi motivo, provo ad accedere a tale elenco, il sistema mi dà un'eccezione di riferimento Null ...

La mia domanda è: perché EF non restituisce liste vuote invece di null? Soprattutto in questo caso, che lo sto persistendo con una lista vuota?

C'è un modo per evitare di verificare se le istanze sono nulle?

+0

qual è la classe del framework entità? –

risposta

21

È necessario che l'entità crei tali elenchi nel costruttore. EF non crea collezioni dipendenti e si aspetta che l'entità lo faccia.

Così, il vostro caso, si potrebbe rendere il vostro soggetto in questo modo:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

Questo risolve definitivamente il mio problema! Grazie per l'aiuto! Quindi l'EF chiama il costruttore di oggetti prima di caricarlo con le informazioni persistenti, vero? –

+0

No, EF non "chiama" il costruttore. C#. Ogni volta che viene creato un oggetto, viene chiamato il costruttore.Anche quando EF materializza oggetti dal db. –

+0

Trovato! Grazie! –

16

Rendere virtuale la raccolta otherClasses. Ciò consentirà a EF di caricare pigro la raccolta.

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

In caso contrario, utilizzare il caricamento con il metodo Include.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

Infatti, il caricamento lento risolve il mio problema ... Ma sto cercando di evitare il caricamento lento perché mi stava dando Errore di serializzazione di riferimento circolare quando stavo usando le richieste JSON. Ad ogni modo, sono felice per il tuo aiuto. Grazie! –

+0

Per problemi di riferimento circolare, è possibile utilizzare attributi come 'JsonIgnore' per impedire la serializzazione di una proprietà di navigazione back-linking. – Jess

0

Quindi, se ho capito bene, si sta aggiungendo un vuoto List<OtherClass> al contesto e poi cercando di recuperarlo.

Immagino che si debba pensare a come il contesto traccerà e interrogherà le entità che si trovano nel suo contesto. Questo di solito è fatto dal Key dell'entità. Nel tuo esempio, non hai assegnato all'entità un valore Key, pertanto il contesto non ha handle nell'entità.

Pertanto, quando si esegue una query, il contesto non trova un oggetto e restituisce null.

Se si desidera inizializzare una nuova entità, si consiglia di assegnarlo almeno a Key (in genere la proprietà Id), quindi selezionare tale chiave quando si effettua una ricerca successiva.

Spero che questo aiuti.

+0

In realtà, le mie vere classi hanno tutte un Attributo ID Era solo un esempio in cui ho dimenticato di includere l'ID: P. Comunque, grazie per la tua risposta! –