7

Ho questa entità:Primo codice EF: come caricare i dati relativi (genitore-figlio-nipote)?

public class DynamicPage { 

    public int PageId { get; set; } 

    public int Order { get; set; } 

    public string MenuText { get; set; } 

    public string MenuHover { get; set; } 

    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 

    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

Questa entità può avere 3 livelli: Parent -> Bambini -> nipote. Come posso caricare il genitore (livello 1) con tutti i figli associati (livello 2) e per ogni bambino, nipote associato (livello 3) se presente? Grazie per l'aiuto.

risposta

10

EF 4.1 funzionalità e la sintassi:

var entity = context.Parents 
    .Include(p => p.Children.Select(c => c.GrandChildren)) 
    .FirstOrDefault(p => p.Id == 1); // or whatever condition 
+0

Non c'è una proprietà chiamata 'GrandChildren'. Intendi questo codice: 'Includi (p => p.Children.Select (c => c.Children))'? –

+0

@Javad_Amiry: Sì. In realtà, quello che ho scritto come 'GrandChildren' può essere una qualsiasi proprietà di navigazione - raccolta o riferimento. Il pattern 'Include (x => x.SomeCollection.Select (c => c.SomeNavigationProperty))' causa solo un 'Include' per il livello successivo. Puoi ripetere quell'infinito: "Seleziona" sulle raccolte, semplici percorsi tratteggiati sui riferimenti. – Slauma

+0

Grazie, a pochi minuti, per testarlo per favore –

0

Se si vuole rendere la vita facile su se stessi, seguire le EF Codice prime convenzioni di denominazione gli ID della tabella semplicemente Id (o, in alternativa, il nome della tabella + Id, per esempio, DyanmicPageId).

Questo dovrebbe lasciare con qualcosa di simile:

public class DynamicPage 
{ 
    public int Id { get; set; } 
    public int Order { get; set; } 
    public string MenuText { get; set; } 
    public string MenuHover { get; set; } 
    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 
    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

allora avete bisogno di impostare la relazione tra genitori e figli in modo esplicito in un metodo OnModelCreating nella classe DbContext.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<DynamicPage>() 
     .HasMany(page => page.Children) 
     .WithRequired(child => child.Parent) 
     .HasForeignKey(child => child.ParentId); 
} 

È quindi possibile selezionare figli o nipoti in base alle esigenze:

var parent = dbContext.DynamicPages.Where(page => page.ParentId == null); 
var children = parent.Children; 
var grandchildren = parent.SelectMany(page => page.Children); 
var allRelatedPages = parent.Union(children).Union(grandchildren); 
+0

Quali sono u parlando? Plz legge di nuovo la Q: ** Come posso caricare il genitore (livello 1) con tutti i figli associati (livello 2) e per ogni bambino, nipote associato (livello 3) se esiste? ** So come mappare le entità, e sapere come caricarli nella relazione a 2 livelli * Parent-Child *. Ma non riesco a caricare un'associazione a 3 livelli. Solo questo! –

+0

Cosa intendi per "caricare"? Intendi selezionare? – devuxer

+0

Carica dal database, preleva da db, seleziona. In questo modo: 'entity.DynamicPages.Where (d => d.ParentId == null) .Include (d => d.Children) .ToList();' Lo so, ma voglio caricare 'd.Children. Bambini che non posso): –

Problemi correlati