Il mio contesto è simile a:
public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = true;
}
//DbSet properties
}
quindi, il caricamento lento è abilitato.
Ho classe seguente:
public class Home
{
private ICollection<Slide> _slides;
[Key]
[Required]
public string Name { get; set; }
[ForeignKey("Header")]
public int? HeaderID { get; set; }
//Navigation properties
public ICollection<Slide> Slides
{
get { return _slides ?? (_slides = new List<Slide>()); }
set { _slides = value; }
}
public Content Header { get; set; }
}
Tieni presente che entrambe le proprietà di navigazione Header
e Slides
vengono utilizzate senza parola chiave virtual
. Per quanto ne so quando non usiamo virtual
parola chiave virtual
- le proprietà dovrebbero caricarsi con entusiasmo.
Tuttavia, quando ottengo la mia entità Home
dal database, entrambe le mie proprietà di navigazione sono null
(ma la proprietà HeaderID
ha valore).
Anche se this.Configuration.LazyLoadingEnabled = false;
a this.Configuration.LazyLoadingEnabled = false;
- preparazioni non caricate - sono ancora null
.
Ecco come ottengo i miei dati da db (usando il pattern del repository):
public static Home GetHomeComponent(
this IRepositoryAsync<Home> repository)
{
var result = repository
.Query()
.Select()
.First();
return result;
}
Ho risolto il mio problema con le proprietà Include
:
public static Home GetHomeComponent(
this IRepositoryAsync<Home> repository)
{
var result = repository
.Query()
.Include(x => x.Header)
.Include(x=>x.Slides)
.Select()
.First();
return result;
}
Tuttavia non è conveniente per me (dal momento che ho troppe proprietà di navigazione da caricare).
Quindi, la mia domanda è:
Non uso virtual
parola chiave virtual
- ma perché le mie proprietà di navigazione non si caricano impazientemente?
O sto facendo qualcosa di sbagliato? C'è un altro modo per caricare le mie proprietà di navigazione senza usare Include
?
Se non si utilizza la parola chiave virtual
significa solo che una volta che si tenta di accedere alla proprietà non virtuale non verrà caricato dal database ma si otterrà un valore Null
.
Non significa che tutte le proprietà delle entità vengano popolate immediatamente, per inserire le Slides
per EG nel codice, devi usare .Include () - questo è un caricamento avido, per caricare la proprietà da te prima di esso Usato .
Puoi creare una funzione generica che popolerà le proprietà richieste per gli argomenti che ottiene (usando params) vedi qui per maggiori dettagli:
EntityFramework Eager Carica tutte le proprietà di navigazione