Ich benutze Entity Framework 5 code first
und ASP.NET MVC 3
.
Ich habe Mühe, das untergeordnete Objekt eines untergeordneten Objekts aufzufüllen. Unten sind meine Klassen ..
Anwendungsklasse;
public class Application
{
// Partial list of properties
public virtual ICollection<Child> Children { get; set; }
}
Kinderklasse:
public class Child
{
// Partial list of properties
public int ChildRelationshipTypeId { get; set; }
public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}
ChildRelationshipType-Klasse:
public class ChildRelationshipType
{
public int Id { get; set; }
public string Name { get; set; }
}
Teil der GetAll-Methode im Repository, um alle Anwendungen zurückzugeben:
return DatabaseContext.Applications
.Include("Children");
Die Child-Klasse enthält einen Verweis auf die ChildRelationshipType-Klasse. Um mit den Kindern einer Anwendung zu arbeiten, hätte ich ungefähr Folgendes:
foreach (Child child in application.Children)
{
string childName = child.ChildRelationshipType.Name;
}
Ich erhalte hier eine Fehlermeldung, dass der Objektkontext bereits geschlossen ist.
Wie kann ich festlegen, dass jedes untergeordnete Objekt das ChildRelationshipType
-Objekt enthalten muss, wie oben beschrieben?
Wenn Sie die Bibliothek System.Data.Entity
Einbinden, können Sie eine Überladung der Include()
-Methode verwenden, die einen Lambda-Ausdruck anstelle eines Strings verwendet. Sie können dann Select()
über Kinder mit Linq-Ausdrücken anstelle von string
Pfaden ausführen.
return DatabaseContext.Applications
.Include(a => a.Children.Select(c => c.ChildRelationshipType));
Mit EF Core in .NET Core können Sie das Schlüsselwort ThenInclude
verwenden:
return DatabaseContext.Applications
.Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);
Untergeordnete Elemente aus der Kindersammlung einschließen:
return DatabaseContext.Applications
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
.Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);
Am Ende habe ich Folgendes getan und es funktioniert:
return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");
Ein gutes Beispiel für die Verwendung des Musters für das generische Repository und die Implementierung einer generischen Lösung dafür könnte in etwa so aussehen.
public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)
{
foreach (var include in includeProperties)
{
query = query.Include(include);
}
return query.ToList();
}