Entity Framework 5에 자식 개체의 자식 개체를 포함시키는 방법


138

그리고를 사용 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위에서 한 것과 같은 개체를 포함하도록 지정하려면 어떻게해야 합니까?


답변:


256

라이브러리를 포함하면 문자열 대신 람다 식을 취하는 메서드 System.Data.Entity오버로드를 사용할 수 있습니다 Include(). 그런 다음 경로가 Select()아닌 Linq 표현을 가진 어린이를 처리 할 수 있습니다 string.

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

6
GraemeMiller 말했듯이, 강력한 형식의 클래스는 문자열을 사용하는 것보다 유지 보수에 대한 더 나은
라이언 Amies

람바 방법은 어떤 버전으로 제공됩니까? 나는 EF 4.0 Codebase에 갇혀있다. 그리고 lamdas를 작동시킬 수 없다. 입력 해 주셔서 감사합니다.
granadaCoder

5
EF 4에서 작동합니다.System.Data.Entity;
Ryan Amies

5
참고-EF 6에서 네임 스페이스는 다음과 같습니다.Microsoft.Data.Entity
Brad

EF 5를 사용하여 .Select (x => x.Child)를 얻을 수는 없었지만 엔티티-UserProfile storedProfile = db.UserProfiles. StateProvince) .Include (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .FirstOrDefault (x => x.UserId == userId);
Geovani Martinez 2014

91

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

6
감사!!! 정말 도움이됩니다! 때때로 당신은 잘못된 지능을 얻을 수 있습니다, 그냥 무시하고 빌드하십시오! :)
muhihsan

좋은 것, 나는 .net 코어를 찾고 있었다 :)
Andy Clarke

1
Children이 컬렉션이고 그 아래에 속성을 포함해야하는 경우 어떻게해야합니까?
dodbrian

그에 대한 과부하를 발견했습니다. 처음에는 분명하지 않았습니다.
dodbrian

1
@dodbrian 과부하는 무엇입니까? 자식이 컬렉션 인 .ThenInclude를 중첩하려고합니다.
Greg Hardin

22

나는 다음을하고 결국 작동합니다 :

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

76
강하게 입력 된 방식이 더 좋습니다. 매직 스트링은 리팩토링에 좋지 않습니다
GraemeMiller

2

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

위의 방법을 어떻게 호출합니까? 예를 들어 주
시겠습니까

@Jamee -List <Expression <Func <PersonObject, object >>> includers = new List <Expression <Func <PersonObject, object >>> (); includers.Add (x => x. 이름); Get <PersonObject> (포함);
gcoleman0828

1
그리고 쿼리는 ...?
Doug Beard

귀하의 질문에 따르지 않는 @DougBeard 죄송합니다.
gcoleman0828

1
@ gcoleman0828 위의 코드 스 니펫에있는 쿼리 변수. 마술처럼 인스턴스화 되었습니까? 그거 어디서 났어?
Doug Beard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.