延迟加载嵌套集

时间:2012-10-07 21:15:22

标签: .net entity-framework lazy-loading

我正在使用Entity Framework和Code First来保存我的数据。

有一个带有嵌套列表的类:

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

数据库上下文由

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

我正在创建一个窗口,用户可以根据AgeGroup修改WeightGroup和它们。为了将ListBox的{​​{1}}属性绑定到ItemsSource,我加载它们并绑定到AgeGroups集:

Local

到此为止,ctx.AgeGroups.Load(); vm.AgeGroups = ctx.AgeGroups.Local; 未加载,因为不需要它们。到目前为止,非常好。

当用户选择WeightGroups进行修改时,必须加载其AgeGroup。到目前为止,我这样做(在WeightGroups属性的setter中):

SelectedAgeGroup

然而,这看起来有点笨拙。首先,因为设置了新列表而不是填充现有列表。此外,还有一些不受欢迎的行为。这包括例如以下内容:

  • 如果修改了value.WeightGroups = (from age in ctx.AgeGroups where age.Id == value.Id select age.WeightGroups).Single(); 并且调用了WeightGroup,则旧组仍然存在,另外还有一个具有修改后值的新组。
  • 如果用户删除了SaveChanges()SelectedAgeGroup.WeightGroups.Remove(...)的实体,则删除的行仍然存在。

我认为,上面列出的重量组的重新加载导致了这一点。

在这种情况下,如何更正Lazy Loading?理想情况下,框架会自动加载必要的SaveChanges()。我读到有关使用WeightGroups代替IQueryable BindingList属性的问题。但是这个接口没有插入和删除实体的方法。此外,如果我只是交换类型,甚至根本不加载WeightGroups

1 个答案:

答案 0 :(得分:1)

你应该能够通过使WeightGroups成为虚拟来解决这个问题,至少在你使用EF 4.1或更高版本的时候......

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

您还必须在上下文中包含DbSet ...

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

然后,当您触摸该属性时,它将自动加载,例如将其显示在列表中。