0

我正在使用带有 Code First 的实体框架来保存我的数据。

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

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

数据库上下文包括

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

我正在创建一个窗口,用户可以在其中修改AgeGroups 及其根据WeightGroups。为了将 aListBoxItemsSource属性AgeGroups绑定到 ,我加载它们并绑定到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();

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

  • 如果 aWeightGroup被修改并被SaveChanges()调用,旧组仍然存在,另外还有一个具有修改值的新组。
  • SelectedAgeGroup.WeightGroups.Remove(...)如果用户使用和删除实体SaveChanges(),则删除的行仍然存在。

我认为,上面列出的重量组的重新加载是造成这种情况的原因。

在这种情况下,正确的延迟加载会是什么样子?理想情况下,WeightGroups框架会自动加载必要的内容。我阅读了有关使用 anIQueryable而不是属性BindingList的信息。WeightGroups但是这个接口没有插入和删除实体的方法。此外,如果我只是交换类型,甚至根本不会AgeGroups加载。

4

1 回答 1

1

您应该能够通过将 WeightGroups 设为虚拟来解决此问题,至少如果您使用的是 EF 4.1 或更高版本...

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

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

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

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

于 2012-10-07T21:27:16.477 回答