Entity Framework 5 code first
とASP.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
オブジェクトを含める必要があることを指定するにはどうすればよいですか?
ライブラリSystem.Data.Entity
を含めると、文字列の代わりにラムダ式を取るInclude()
メソッドのオーバーロードを使用できます。 string
パスではなく、Linq式を使用して、Select()
子を上書きできます。
return DatabaseContext.Applications
.Include(a => a.Children.Select(c => c.ChildRelationshipType));
.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);
私は次のことをしましたが、うまくいきました:
return DatabaseContext.Applications
.Include("Children.ChildRelationshipType");
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();
}