Ado.net Entity : 객체가 연결된 멤버 (외국 키)를 표시하지 않습니다.
-
09-09-2019 - |
문제
간단한 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();
이제 올바르게 표시됩니다.