0

データを永続化するために、コードファーストでEntityFrameworkを使用しています。

ネストされたリストを持つクラスがあります:

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

データベースコンテキストは、

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

AgeGroupユーザーがとそれに応じてを変更できるウィンドウを作成していますWeightGroupListBoxItemsSourceプロパティをにバインドするために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ものはフレームワークによって自動的にロードされます。プロパティのIQueryable代わりに使用することについて読みBindingListました。WeightGroupsただし、このインターフェイスには、エンティティを挿入および削除するためのメソッドがありません。さらに、タイプを交換するだけでは、AgeGroupsまったくロードされません。

4

1 に答える 1

1

少なくともEF4.1以降を使用している場合は、WeightGroupsを仮想化することでこれを解決できるはずです...

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

また、コンテキストにDbSetを含める必要があります...

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

次に、プロパティをタッチすると、たとえばリストに表示するために、プロパティが自動的に読み込まれます。

于 2012-10-07T21:27:16.477 に答える