2012-10-07 3 views
0

코드 첫 번째로 Entity Framework를 사용하여 데이터를 유지합니다.느린로드 중첩 집합

public class AgeGroup 
{ 
    public BindingList<WeightGroup> WeightGroups { get; set; } 
} 

데이터베이스 컨텍스트가 나는 사용자가 AgeGroup의과에 따라 WeightGroup의를 수정할 수있는 창을 만드는 오전

public DbSet<AgeGroup> AgeGroups { get; set; } 

구성 : 중첩 된 목록 클래스가 있습니다

. AgeGroupsListBoxItemsSource 속성을 결합하기 위해, 나는 그들을로드하고 Local 세트 바인딩 :

ctx.AgeGroups.Load(); 
vm.AgeGroups = ctx.AgeGroups.Local; 

여기까지가는 WeightGroups가로드되지 않습니다, 그들은이 필요하지 않은 때문이다. 여태까지는 그런대로 잘됐다.

사용자가 수정을 위해 AgeGroup을 선택하면 해당 WeightGroups이로드되어야합니다. 지금까지 내가합니다 (SelectedAgeGroup 재산의 세터에) 이런 식으로 작업을 수행합니다

value.WeightGroups = (from age in ctx.AgeGroups 
         where age.Id == value.Id 
         select age.WeightGroups).Single(); 

그러나이 조금 서투른 것 같다. 첫째, 기존 목록을 채우는 대신 새 목록이 설정되기 때문입니다. 게다가, 원하지 않는 행동들이 있습니다. 예를 들면 다음과 같습니다. 다음을 수행하십시오 WeightGroup이 수정되고 SaveChanges()가 호출

  • 경우 이전 그룹이 추가적으로 여전히 수정 된 값을 가진 새로운 하나입니다.
  • 사용자가 SelectedAgeGroup.WeightGroups.Remove(...)SaveChanges() 인 엔티티를 제거하는 경우 삭제 된 행은 계속 존재합니다.

위의 목록에서와 같이 체중 그룹을 새로 고침한다고 가정합니다.

이 경우 레이즈로드가 어떻게 수정 될까요? 이상적으로 필요한 프레임 인 WeightGroups은 프레임 워크에 의해 자동으로로드됩니다. WeightGroups 속성에 BindingList 대신 IQueryable을 사용하는 방법에 대해 읽었습니다. 그러나이 인터페이스에는 엔터티를 삽입하고 제거하는 메서드가 없습니다. 또한, 만약 내가 타입을 교환한다면, AgeGroups조차 전혀로드되지 않습니다. 당신은 또한 상황에 DbSet을 포함해야 EF 4.1 이상 ...

public class AgeGroup 
{ 
    public virtual BindingList<WeightGroup> WeightGroups { get; set; } 
} 

을 사용하고 적어도 경우

답변

1

당신은 WeightGroups 가상하여이 문제를 해결 할 수 있어야한다. ..

public DbSet<WeightGroup> WeightGroups { get; set; } 

그런 다음 속성을 터치하면 목록에 자동으로 표시됩니다.

+0

완벽한, 감사합니다. List가 가상이어야하는 이유를 설명 할 수 있습니까? Btw, 또 다른'DbSet <>'없이도 작동합니다. –

+0

이 경우 EF가 수행하는 작업은 AgeGroup 클래스의 하위 클래스를 만들고 WeightGroups 게터에서 지연로드를 구현하는 것입니다. 코드가 항상 WeightGroups를 사용할 수 있다고 가정 할 수 있기 때문에 매우 뛰어나지 만 일부 시나리오에서는 속성을 건드리지 않으면로드되지 않습니다. –

관련 문제