2

それぞれが他のコレクションを含む 2 つの POCO クラスがあります。これらのクラス間に多対多の関係を構成しようとしています。ただし、コンテキストを読み込むと、EF は各オブジェクトのコレクションをまったく設定しません。これはどのように自動的に行うことができますか?

public class POCO1
{
    public int ID { get; set; }
    public virtual ICollection<POCO2> POCO2s { get; set; }
}

public class PCOO2
{
    public int ID { get; set; }
    public virtual ICollection<POCO1> POCO1s { get; set; }        
}

public class POCOContext : DbContext
{
    public DbSet<POCO1> POCO1s { get; set; }
    public DbSet<POCO2> POCO2s { get; set; }

    modelBuilder.Entity<POCO1>()
        .HasKey(p => p.ID);

    modelBuilder.Entity<POCO1>()
        .HasMany(p => p.POCO2s).WithMany(p => p.POCO1s);

    modelBuilder.Entity<POCO2>()
        .HasKey(p => p.ID);

    modelBuilder.Entity<POCO2>()
        .HasMany(p => p.POCO1s).WithMany(p => p.POCO2s);
}

public class Test
{
    static void Main(string[] args)
    {
        using (var context = new POCOContext())
        {
            context.Database.Initialize(true);
            var p1 = context.POCO1s.Create();
            var p2 = context.POCO2s.Create();
            p1.POCO2s.Add(p2);
            p2.POCO1s.Add(p1);
            context.saveChanges();
        }

        // reload context from db
        using (var context = new POCOContext())
        {
            context.POCO1s.ToList()[0].POCO2s.Count();    // == 0, but should be 1
            context.POCO2s.ToList()[0].POCO1s.Count();    // == 0, but should be 1
        }
    }
}

詳細情報を含めるように編集します。私が読んだことから、注釈を含めたり、Fluent API を使用してキーを指定したりする必要はありません。これらの規則を使用すると、EF 5.0 は関係を正しく構成する必要があります。データベース テーブルは最初にコードを使用して正しく構築されているため (POCO1 テーブル、POCO2 テーブル、交差テーブルがあり、これらはすべてテスト中に正しく取り込まれます)、実際にそのように見えます。問題は、データを読み戻すときに、多対多の関係が取り込まれていないように見えることです。SO に関する他の投稿、さまざまなチュートリアル、および MSDN のドキュメントでは、適切な規則、遅延読み込み、および仮想コレクションを使用すると機能するはずですが、それは私が見ている動作ではありません。

4

1 に答える 1