1

現在、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がリストの作成に苦労している理由はよくわかりません。例外はスローされませんが、どこかにサイレントにログが記録されるかどうかはわかりません。

4

1 に答える 1

5

交換してみてください...

HasKey(t => t.ParentUK);
HasKey(t => t.Sequence);

...に...

HasKey(t => new { t.ParentUK, t.Sequence });

...これは複合キーを定義する正しい方法です。元のマッピングでは、EFがキーとしてのみ見なすようにHasKey(t => t.Sequence)上書きされます。HasKey(t => t.ParentUK)Sequence

于 2013-03-19T20:27:31.453 に答える