web-dev-qa-db-ja.com

Entity Framework 5に子オブジェクトの子オブジェクトを含める方法

Entity Framework 5 code firstASP.NET MVC 3を使用しています。

子オブジェクトの子オブジェクトを取得するのに苦労しています。以下は私のクラスです。

アプリケーションクラス。

public class Application
{
     // Partial list of properties

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

子クラス:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

ChildRelationshipTypeクラス:

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

     public string Name { get; set; }
}

すべてのアプリケーションを返すリポジトリ内のGetAllメソッドの一部:

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

Childクラスには、ChildRelationshipTypeクラスへの参照が含まれています。アプリケーションの子を操作するには、次のようにします。

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

ここで、オブジェクトコンテキストが既に閉じられているというエラーが表示されます。

上記のように、各子オブジェクトにChildRelationshipTypeオブジェクトを含める必要があることを指定するにはどうすればよいですか?

115
Brendan Vogt

ライブラリSystem.Data.Entityを含めると、文字列の代わりにラムダ式を取るInclude()メソッドのオーバーロードを使用できます。 stringパスではなく、Linq式を使用して、Select()子を上書きできます。

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

.NET CoreのEF Coreでは、キーワードThenIncludeを使用できます。

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

子コレクションの子を含める:

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

私は次のことをしましたが、うまくいきました:

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

Generic Repositoryパターンを使用し、これに対する一般的なソリューションを実装する良い例は、次のようになります。

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