現在、Pervasiveデータベースに接続するEntityFrameworkを使用したnullの子の値に関して奇妙な問題が発生しています。私はかなり新しいEFなので、用語が間違っている可能性があります。
私には2つのクラスがあり、それらを親と子と呼びます。設定方法は次のとおりです。
public class Parent
{
public int ParentUK { get; set; }
public int ParentName { get; set; }
public int Status { get; set; }
public virtual IList<Child> Children { get; set; }
}
マッピングファイル付き
public class Parent_Map : SchemaNameEntityTypeConfiguration<Parent>
{
public Parent_Map(string schemaName)
: base(schemaName)
{
ToTable("Parent");
HasKey(p => p.ParentUK);
Property(p => p.ParentUK)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.ParentName)
.IsRequired();
Property(p => p.Status)
.IsRequired();
HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.ParentUK);
}
}
そしてチャイルドクラス
public class Child
{
public int ParentUK { get; set; }
public int Sequence { get; set; }
public int ChildName { get; set; }
}
マッピング:
public class Child_Map : SchemaNameEntityTypeConfiguration<Child>
{
public Child_Map(string schemaName)
: base(schemaName)
{
ToTable("Child");
HasKey(t => t.ParentUK);
HasKey(t => t.Sequence);
Property(t => t.ParentUK)
.IsRequired();
Property(t => t.Sequence)
.IsRequired();
Property(t => t.ChildName)
.IsRequired();
}
}
次のクエリを実行すると、それぞれ3人の子を持つ2人の親のリストが表示されると思います。
var result = context.Parents
.Include(p => p.Children)
.Where(p => p.ParentUK < 3);
foreach (var thing in result)
{
if (thing.Children != null)
{
Console.WriteLine(thing.ParentName+ " has some children " + thing.Children.Count);
}
else
{
Console.WriteLine(thing.ParentName+ " has NO children ");
}
}
基礎となるSQLに2つのテーブル間の結合が含まれ、6行が返されることを確認しました。
私が苦労している問題は、最初の結果には子のリストが含まれていますが、2番目の結果のリストはnullであるということです。個々のIDを追跡してクエリを実行すると、すべてが正しく機能するため、マッピングに問題があるかどうかわかりません。
より多くの結果でクエリを実行すると、次のようになります
P1 has some children 3
P2 has NO children
P3 has NO children
P4 has NO children
P5 has some children 3
P6 has NO children
P7 has NO children
P8 has NO children
遅延読み込みを使用してクエリを実行すると、同様の結果が得られますが、代わりにP7には子があり、P5にはありません。
これは一般的な例ですが、私の問題を説明する必要があります。EFがリストの作成に苦労している理由はよくわかりません。例外はスローされませんが、どこかにサイレントにログが記録されるかどうかはわかりません。