我正在使用带有 Code First 的实体框架来保存我的数据。
有一个带有嵌套列表的类:
public class AgeGroup
{
public BindingList<WeightGroup> WeightGroups { get; set; }
}
数据库上下文包括
public DbSet<AgeGroup> AgeGroups { get; set; }
我正在创建一个窗口,用户可以在其中修改AgeGroup
s 及其根据WeightGroup
s。为了将 aListBox
的ItemsSource
属性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();
但是,这似乎有点笨拙。首先,因为设置了一个新列表而不是填充现有列表。此外,还有一些不受欢迎的行为。这包括例如以下内容:
- 如果 a
WeightGroup
被修改并被SaveChanges()
调用,旧组仍然存在,另外还有一个具有修改值的新组。 SelectedAgeGroup.WeightGroups.Remove(...)
如果用户使用和删除实体SaveChanges()
,则删除的行仍然存在。
我认为,上面列出的重量组的重新加载是造成这种情况的原因。
在这种情况下,正确的延迟加载会是什么样子?理想情况下,WeightGroups
框架会自动加载必要的内容。我阅读了有关使用 anIQueryable
而不是属性BindingList
的信息。WeightGroups
但是这个接口没有插入和删除实体的方法。此外,如果我只是交换类型,甚至根本不会AgeGroups
加载。