2

私はコード ファーストの Entity Framework を使用しており、それぞれに ICollection を追加することで、ObjectA と ObjectB の間に多対多の関係を簡単に作成できることを知っています。EF は、バックグラウンドでリンク テーブルを自動的に作成します。

public class ObjectA {
    public ICollection<ObjectB> ObjectsB { get; set; }
}

public class ObjectB {
    public ICollection<ObjectA> ObjectsA { get; set; }
}

このリレーションに追加のプロパティが必要になったので、独自のリンク テーブルを作成しました。

public class ObjectA {
    public ICollection<ObjectA_ObjectB> AtoB { get; set; }
}

public class ObjectB {
    public ICollection<ObjectA_ObjectB> BtoA { get; set; }
}

public class ObjectA_ObjectB {
    public ObjectA A { get; set; }
    public ObjectB B { get; set; }

    public DateTime MyStartDate { get; set; }
}

これは正常に機能しますが、大きな損失は、エンティティに ObjectB と ObjectA の直接のコレクションがなくなったことです。明示的なリンク テーブルを使用するだけで、関係は同じですが。

直接のコレクションを取り戻したいです。上記の 2 つの方法を組み合わせる (ModelBuilder またはデータ注釈を使用して) 方法はありますか?

4

1 に答える 1

2

いいえ、元のコレクションをナビゲーション プロパティとして使用する方法はありません。あなたができることは、データベースにマップされておらず、読み取り専用のヘルパー コレクションを追加することです。

public class ObjectA {
    public ICollection<ObjectA_ObjectB> AtoB { get; set; }

    public IEnumerable<ObjectB> ObjectsB
    {
        get { return AtoB.Select(ab => ab.B); }
    }
}

をロードするクエリはAtoB、目的の結果を提供します。

var objectA = context.ObjectAs
    .Include(a => a.AtoB.Select(ab => ab.B)).First();

// objectA.ObjectsB would return the Bs now

ただし、このコレクションをクエリで使用したり、このコレクションを介して関係を操作したりすることはできないため、かなり制限されています。これには常にAToBコレクションを使用する必要があります。

于 2013-05-06T19:25:08.750 に答える