2015-01-21 4 views
1

ID 공급자 2.0에서 Users 테이블로 이동하는 여러 개의 외부 특성이 포함 된 테이블이 있습니다.데이터베이스 최적화 - 엔터티 프레임 워크 외래 키 특성

[ForeignKey("IsApprovedBy")] 
    public ApplicationUser IsApprovedByUser { get; set; } 
    public string IsApprovedBy { get; set; } 

정규화로 인해이 외래 키를 신경 쓸 필요가 없다는 것을 알고 있지만 이것은 문제가 아닙니다.

내가 가진 문제는 데이터를 가져 와서 프론트 엔드로 반환하면 Entity 프레임 워크가 호출시 데이터베이스를 호출하는 대신 이러한 ApplicationUsers를 채우기 위해 데이터베이스를 3 번 ​​호출한다는 것입니다.

Db.Contractors.Include(x => x.IsApprovedByUser) 

같은 내 쿼리를 실행하는 동안 그는 왜 (다른 모든 데이터가 이미로드) 내 값을 반환하지 때 특정 데이터를 얻을 수있는 데이터베이스 전화는 무엇입니까?

미리 감사드립니다.

추적 캡처 : enter image description here

+2

은 EF에서 지연로드 문제와 유사합니다. DbContext에서 지연로드를 비활성화하고 다시 확인하십시오. – trailmax

+0

이것은 실제로 내 테스트 중 일부가 Indentity 공급자의 'Users'또는 'Roles' 테이블을 사용하여 실패한다는 것만이 유일한 문제인 것처럼 보입니다. 이것은 이상한데, 작동하지 않으면 서 작동합니다. 이걸 잡는거야? – Tikkes

+0

기본적으로 Identity는 기본적으로 하위 개체를 가져 오지 않으므로 'ApplicationUser'에서 걸려있는 모든 탐색 속성에 NullReferenceExceptions가 표시됩니다. 일반적으로 게으른로드가 해제 된 상태에서 더 나을 것입니다. 이렇게하면 EF가 내릴 수있는 미친 짓을 피할 수 있습니다. – trailmax

답변

1

이 게으른로드하지 아이덴티티에서 폼 DbContext를 오는 문제입니다. 기본적으로 ApplicationUser 또는 ApplicationRole을로드하면 Identity에 하위 개체가 포함되지 않습니다.

지연로드를 해제하면 DB에 대한 다중 요청 문제가 사라지지만 자식 개체의 경우 null은 ApplicationUser이됩니다. DB 요청 및 DB 성능의 수를 고려한다면 지연로드를 사용하지 않는 것이 좋습니다. 그러나 자식 개체를 개별적으로로드하는 작업을해야합니다.