10

내 모든 POCO에 대해 탐색 및 컬렉션 속성이 모두 null입니다.코드 첫 번째 자동 gen 프록시 클래스 탐색 및 컬렉션 속성이 null입니다.

배경 정보를 제공해 드리겠습니다. EF 4.3.1을 사용하는 복잡한 코드 첫 번째 프로젝트가 있습니다. 프록시 생성이 비활성화되었습니다. 수집 및 탐색 속성은 수동으로 관리되었습니다.

이제 프록시 만들기 및 지연로드를 사용하도록 설정하고 있습니다. 디버깅 할 때 내 엔티티 (알려진 POCO 유형으로 캐스팅 된)가 실제로 자동 생성 된 프록시 클래스라는 것을 알 수 있습니다. 여태까지는 그런대로 잘됐다.

지금 내 탐색 속성을 보면 null입니다. 마찬가지로 컬렉션 속성도 null입니다.

리플렉션을 사용하여 프록시 클래스가 내 탐색 및 컬렉션 속성을 재정의했음을 알 수 있습니다.

모든 탐색 및 수집 속성은 가상입니다. 예컨대 :

public virtual NavigationType NavigationName { get; set; } 
public virtual ICollection<CollectionType> CollectionName { get; set; } 

또한, 모든 테이블이 같은 초기화됩니다

modelBuilder.Entity<TEntity>() 
.Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("TableName"); 
}); 

는 또한 예상대로 데이터베이스가 생성되는 것을 확인할 수 있습니다. 외래 키는 모두 존재하며 예상 필드와 연관됩니다.

왜 null입니까? 어떻게 진단 할 수 있습니까?

+0

큰 질문입니다. – mattytommo

+0

이 컬렉션 속성은 클래스에서 '가상'으로 표시되어 있습니까? – alex

+0

요구 사항을 확인하십시오 - http://msdn.microsoft.com/en-gb/library/vstudio/dd468057(v=vs.100).aspx – devdigital

답변

5

어떻게이 더 진단 할 수 있습니까?

변경 사항 추적기의 context.ChangeTracker.Entries() 컬렉션을 살펴보면 검사중인 엔티티가 컨텍스트에 첨부되어 있는지 확인할 수 있습니다.

Entity entity = context.Entities.Create(); 

entity 프록시 수 있지만 NavigationNameCollectionNamenull 될 것이며 그들이 경우에도 null 유지됩니다 :

그것은 당신이 예를 들어, 모든 탐색 속성 null 인 상태 동적 프록시를 가지고도 가능 이러한 속성에 액세스하면 (NullReferenceException 초) 이는 엔티티를 부착 할 때만 변경됩니다 :

context.Entities.Attach(entity); 

속성에 액세스하면 지연로드가 실행됩니다. NavigationName 데이터베이스에 관련 엔터티가없는 경우 null에 머물러 있지만 컬렉션 CollectionName은 첨부하고 액세스 한 후에는 null이 될 수 없습니다. DB에 관련 엔티티가없는 경우 결과는 빈 콜렉션이어야하지만 null이 아니다.

+0

흥미 롭습니다. 내가 취하는 길은 네가 말하는 것과 같다. .Create()를 사용하지만, 커밋 할 준비가 될 때까지 .Attach (..)하지 않습니다. 나는 지금 조사 할 것이다. –

+0

머리에 손톱. 엔티티가 처음 생성 될 때 초기화를 구현하지 않았습니다. Ta 대단히! –