Ho questa entità:
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: Genitore -> Bambino -> 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.
Funzione EF 4.1 e sintassi:
var entity = context.Parents
.Include(p => p.Children.Select(c => c.GrandChildren))
.FirstOrDefault(p => p.Id == 1); // or whatever condition
Se vuoi semplificarti la vita, segui il Codice EF Prime convenzioni di nominare gli ID della tua tabella semplicemente Id
(o, in alternativa, nome della tabella + Id
, ad es. DyanmicPageId
).
Questo dovrebbe lasciarti con qualcosa di simile a questo:
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; }
}
Quindi è necessario 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 bambini o nipoti, se necessario:
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);