.Includes ()를 사용하여 EF6 쿼리를 실행하면 EntityException이 throw됩니다.

c# entity-framework entity-framework-6

문제

EF4 솔루션을 EF6으로 마이그레이션하는 데 문제가 있습니다.

우리는 T4 템플릿을 사용하여 ObservableCollection <T>을 기반으로 탐색 속성이있는 영구 무명 POCO를 생성합니다.

ObjectContext 구현은 엔티티 집합을 IObjectSet <entity>로 나타 내기 때문에 ObjectQuery에서 Include () 메서드를 잃어 버리고 다음과 같이 IQueryable의 확장 메서드를 사용하여 다시 가져와야합니다.

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
{
    IQueryable<TSource> returnValue = source;
    var objectQuery = source as ObjectQuery<TSource>;

    if (objectQuery != null)
    {
        returnValue = objectQuery.Include(path);
    }

    return returnValue;
}

EF6을 사용하도록 솔루션을 업데이트하면 .Include ()를 사용하여 쿼리를 실행할 때 다음과 같은 System.Data.Entity.Core.EntityException이 표시됩니다.

"Entity Framework에서 컬렉션의 변경 내용을 추적 할 수 있으려면 'DataEntities.Parent'형식의 엔터티에 대한 탐색 속성 'Details'가 ICollection <T>을 구현해야합니다."

내가 얻지 못하는 것은 'Details'속성이 ICollection <T> 인 ObservableCollection <T>을 상속하는 사용자 정의 유형이므로 ICollection <T>을 구현해야한다고 명시하는 이유는 무엇입니까?

누구든지 이것에 흘리게 될 빛이 있다면 고마워 할 것입니다. 고마워요.

인기 답변

EF 팀원의 블로그 포스트 에서 설명한 것처럼

변경 추적 프록시를 사용하기 위해 클래스가 따라야하는 규칙은 매우 엄격하고 제한적입니다. 이것은 엔티티를 정의 할 수있는 방법을 제한하고 개인 속성 또는 개인 설정 자의 사용을 방지합니다.

규칙은 다음과 같습니다.

  • 수업은 공개이어야하며 봉인되어서는 안됩니다.
  • 모든 속성에는 public / protected 가상 getter 및 setter가 있어야합니다.
  • 컬렉션 탐색 속성은 ICollection으로 선언되어야합니다. IList, List, HashSet 등일 수 없습니다.

그리고 당신이 당신의 구현을 사용할 수없는 이유에 대한 이 대답 .



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.