データを永続化するために、コードファーストで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まったくロードされません。