データを永続化するために、コードファーストでEntityFrameworkを使用しています。
ネストされたリストを持つクラスがあります:
public class AgeGroup
{
public BindingList<WeightGroup> WeightGroups { get; set; }
}
データベースコンテキストは、
public DbSet<AgeGroup> AgeGroups { get; set; }
AgeGroup
ユーザーがとそれに応じてを変更できるウィンドウを作成していますWeightGroup
。ListBox
の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
ものはフレームワークによって自動的にロードされます。プロパティのIQueryable
代わりに使用することについて読みBindingList
ました。WeightGroups
ただし、このインターフェイスには、エンティティを挿入および削除するためのメソッドがありません。さらに、タイプを交換するだけでは、AgeGroups
まったくロードされません。