web-dev-qa-db-fra.com

Comment inclure l'objet enfant d'un objet enfant dans Entity Framework 5

J'utilise Entity Framework 5 code first et ASP.NET MVC 3.

Je me bats pour que l'objet enfant d'un objet enfant soit peuplé. Ci-dessous sont mes cours ..

Classe d'application;

public class Application
{
     // Partial list of properties

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

Classe enfant:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

Classe ChildRelationshipType:

public class ChildRelationshipType
{
     public int Id { get; set; }

     public string Name { get; set; }
}

Partie de la méthode GetAll dans le référentiel pour renvoyer toutes les applications:

return DatabaseContext.Applications
     .Include("Children");

La classe Child contient une référence à la classe ChildRelationshipType. Pour travailler avec les enfants d'une application, j'aurais quelque chose comme ceci:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

Je reçois une erreur ici que le contexte de l'objet est déjà fermé.

Comment spécifier que chaque objet enfant doit inclure l'objet ChildRelationshipType comme ce que j'ai fait ci-dessus?

115
Brendan Vogt

Si vous incluez la bibliothèque System.Data.Entity, Vous pouvez utiliser une surcharge de la méthode Include() qui prend une expression lambda au lieu d'une chaîne. Vous pouvez alors Select() sur les enfants avec des expressions Linq plutôt que string chemins.

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));
228
Ryan Amies

Avec EF Core dans .NET Core, vous pouvez utiliser le mot-clé ThenInclude:

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

Inclure les enfants de la collection pour enfants:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);
57
Hayha

J'ai fini par faire ce qui suit et ça marche:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");
20
Brendan Vogt

Un bon exemple d'utilisation du modèle de référentiel générique et de la mise en œuvre d'une solution générique pourrait ressembler à ceci.

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}
3
gcoleman0828