我正在使用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
。
答案 0 :(得分:1)
你应该能够通过使WeightGroups成为虚拟来解决这个问题,至少在你使用EF 4.1或更高版本的时候......
public class AgeGroup
{
public virtual BindingList<WeightGroup> WeightGroups { get; set; }
}
您还必须在上下文中包含DbSet ...
public DbSet<WeightGroup> WeightGroups { get; set; }
然后,当您触摸该属性时,它将自动加载,例如将其显示在列表中。