2017-12-03 16 views
1

EF 6.X에서 코드 우선 접근 방식을 사용하고 있습니다. 두 엔티티와 컨텍스트가 있습니다db에서 엔터티를 읽을 때 외부 키와 연결된 속성이 설정되지 않았습니다.

class Product 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
    ProductCategory ProductCategory { get; set; } 
} 

class ProductCategory 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
} 

class ProductContext : DbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<ProductCategory> ProductCategories { get; set; } 
} 

내가 모델에서 데이터베이스를 만들 항목을 추가하고 다시 읽을 수 있어요 예상되는 명명 규칙을 사용하고로 - 데이터 주석없이와 유창한를 사용하지 않고를 API. 사실, 실제로 유창한 API를 사용하여 일부 속성에서 HasMaxLength를 설정했지만 해당 구성 코드는 키나 외래 키를 설정하지 않습니다. 여기

중요한 점은 다음과 같은 호출 할 때이다 :

Product product = context.Products.Find(1).FirstOrDefault(); 

제품의 ProductCategory이 제대로 ProductCategory 예를 채워집니다. 내가 겪고있는 문제는이 동작이 일관성이없는 것 같습니다.

WebApi 컨트롤러 내에서 ProductContext 클래스의 인스턴스를 만들고 위의 스 니펫과 동일한 작업을 읽습니다. 결과는 올바르게 인스턴스화되지만 ProductCategory 속성이 null로 설정된 제품입니다.

누구나이 두 가지 사용법의 차이점을 설명 할 수 있습니까? DbContext에서 파생 된 컨텍스트가 Product 테이블의 외래 키 항목을 ProductCategory 클래스의 인스턴스로 변환 할 수있는 전제 조건은 무엇입니까?

+1

여기에 좀 더 관련 코드를 추가합니다. EF 컨텍스트를 어떻게 구성합니까? – Fabjan

+1

* 제품의 ProductCategory가 ProductCategory 인스턴스로 올바르게 채워집니다. * - 'ProductCategory'가 지연로드되지 않습니다 ('가상 '이 아닙니다). 컨텍스트에서 이전에로드 된 경우에만 채울 수 있습니다. 코드의 두 부분이 다른 측면을주의 깊게 확인하십시오. –

답변

1

기본적으로 Entity Framework는 DB에서 개체를로드 할 때 관련 개체를로드하지 않습니다. 당신은해야합니다

사용 Include 문 :

context.Products.Include(p => p.ProductCategory).FirstOrDefault(p => p.Id == 1); 

또는 virtual으로 탐색 속성 표시하여 게으른 로딩을 사용 : 다음

class Product 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
    virtual ProductCategory ProductCategory { get; set; } 
} 

ProductCategory로드 처음으로 것 만지십시오. 수동으로

또는 부하 참조 :

context.Entry(product).Reference(p => p.ProductCategory).Load();