문제

간단한 DatabaseScheme : 사용자, 계정이 있습니다. 사용자는 계정과 1 대의 관계가 있습니다.

ADO.NET 엔티티 데이터 모델을 생성했으며 사용자와 계정을 생성하고 함께 연결할 수도 있습니다. 데이터베이스에서 ac

그러나 user.account.tolist ()를 acces하려고하면 결과가 없습니다.

User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 0...

이전 코드 전에 다음 코드를 추가하면 갑자기 올바른 카운트 2를 제공합니다.

 Account account1 = db.Account.First(A => A.id == 1);
 Account account2 = db.Account.First(A => A.id == 2);
 User user = db.User.First(U => U.id == 1);
 List<Account> accounts = user.Account.ToList(); ##count = 2...??

내가 여기서 무엇을 놓치고 있습니까 ??

도움이 되었습니까?

해결책

당신은 사용해야합니다 ObjectQuery.include 이것을위한 방법. 방법도 작동하지만 추가 쿼리가 발생합니다.

당신의 예에서 당신은 얻을 것입니다

User user = db.User.Include("Account").First(u => u.id == 1);

문자열이 있는지 알아 내야합니다 "Account" 맞다. 일반적으로 같은 것으로 접두사해야합니다 MyEntities. 이것은 엔티티의 네임 스페이스에 따라 다르지만 약간의 시행 착오로이를 알아낼 수 있어야합니다.

다른 팁

예, 그것은 엔티티 프레임 워크를 사용하기 시작할 때 일반적인 문제입니다. 부모 나 아동 관계가 게으른로드되지 않으므로 명시 적으로로드해야합니다. 클래스 / 메소드 사이의 객체 컨텍스트를 공유하려면 관계가 이미로드되었는지 확인할 수 있습니다.

예를 들어

    if(!user.Account.IsLoaded)
        user.Account.Load();

간단한 확장 방법으로 더 쉽게 만들 수 있습니다.

public static class EntityExtensions
{
    public static void EnsureLoaded(this RelatedEnd relatedEnd)
    {
        if (!relatedEnd.IsLoaded)
            relatedEnd.Load();
    }
}

이것을 사용하면로드 호출이 다시 짧아집니다.

user.Account.EnsureLoaded();

그리고 엔티티 프레임 워크에서 부모와 자식 관계에 공통적 인 관련텐더를 사용하므로 부모 참조 관계에도 사용할 수 있습니다.

account.UserReference.EnsureLoaded();

RWWILDEN이 말했듯이,이 경우 부모와 함께 자식 물체를 항상로드하려는 경우, 통화를보다 효율적으로 만들고 데이터베이스에 대한 추가 왕복을 피하기 위해 포함을 사용하려고 할 수 있습니다.

내 지식이 프레임 워크의 약간 작다 고 생각합니다. :)

관련 계정을 먼저 명시 적으로로드해야합니다.

user.Account.Load();

이제 올바르게 표시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top