172 votes

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

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

J'ai du mal à faire en sorte que l'objet enfant d'un objet enfant se remplisse. Voici mes classes

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 retourner 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;
}

J'obtiens une erreur ici que le contexte de l'objet est déjà fermé.

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

287voto

Ryan Amies Points 1872

Si vous incluez la bibliothèque System.Data.Entity vous pouvez utiliser une surcharge de la fonction Include() qui prend une expression lambda au lieu d'une chaîne de caractères. 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));

155voto

Hayha Points 623

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);

23voto

Brendan Vogt Points 5000

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

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

1voto

gcoleman0828 Points 421

Un bon exemple d'utilisation du modèle de référentiel générique et de mise en œuvre d'une solution générique pour cela 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();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X