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?
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));
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);
J'ai fini par faire ce qui suit et ça marche:
return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");
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();
}