15

包含オブジェクトを介して中間テーブルをマップできるかどうかに興味がありました。

public class Subscriber : IEntity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    private ChannelList _subscribedList { get; set; }
    public int NumSubscribedChannels { get { return _subscribedList.Count(); } }
}

public class HelpChannel : IEntity
{
    [Key]
    public int Id { get; set; }
    public string name { get; set; }
    public string category { get; set; }
    public int group { get; set; }
}

サブスクライバーを自分のチャネルにリンクするには、サブスクライバーテーブル、チャネルテーブル、および中間テーブルが必要です。

ChannelList オブジェクト内のリストをサブスクライバー モデルにマップすることは可能ですか?

それはおそらく不可能であり、EFがマップするためのプライベートリストが必要であると考えました。しかし、EF がプライベート変数に対してそれを行うかどうかはわかりませんでした。しますか?

カプセル化を維持するために公開する必要がある場合は、そうなることを願っています。

4

1 に答える 1

39

プライベート プロパティは、EF コード ファーストでマップできます。ここにそれを行う方法の素晴らしい説明があります。あなたの場合、それは のマッピングに関するものSubscriber._subscribedListです。あなたができないことはこれです(コンテキストのオーバーライドでOnModelCreating):

modelBuilder.Entity<Subscriber>().HasMany(x => x._subscribedList);

_subscribedListプライベートであるため、コンパイルされません。

でできることは、ネストされたマッピング クラスを作成することですSubscriber

public class Subscriber : IEntity
{
    ...
    private ICollection<HelpChannel> _subscribedList { get; set; } // ICollection!

    public class SubscriberMapper : EntityTypeConfiguration<Subscriber>
    {
        public SubscriberMapper()
        {
            HasMany(s => s._subscribedList);
        }
    }
}

とでOnModelCreating

modelBuilder.Configurations.Add(new Subscriber.SubscriberMapping());

_subscribedList遅延読み込みを可能にするために、保護された仮想を作成することができます。しかし、以下を使用して熱心な読み込みを行うことさえ可能ですInclude:

context.Subscribers.Include("_subscribedList");
于 2012-12-10T22:58:03.183 に答える