2

次の 2 つのモデルがあるとします。

Person             N
Subscription       N

それらは多対多の関係にある (各 Person は複数のサブスクリプションを持つことができ、各サブスクリプションは複数の Person を持つことができる) ため、Entity Framework は相互参照テーブルを作成します。

PersonSubscriptions:  PersonId  |  SubscriptionId

各ユーザーがいつ購読を開始したかを記録したい場合は、相互参照テーブルに Date 列を含めるのが最も理にかなっています。

PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn

Entity Framework でこれを達成するにはどうすればよいですか? また、たとえば、X 日以降にサブスクライブしたすべての Person を特定のサブスクリプションに取得するには、どのようにクエリを実行すればよいでしょうか?

4

1 に答える 1

3

この状況では、従来の意味での多対多の関係がなくなり、代わりに、3 番目のエンティティとの 2 つの異なる 1 対多の関係が生じます。本質的に、作業する 3 つのクラスがあります。

Public Class Person {
    public int PersonId {get;set;}
    public virtual IEnumerable<SubscriptionInfo> SubscriptionInfos {get;set;}
}

Public Class Subscription {
    public int SubscriptionId {get;set;}
    public virtual IEnumberable<SubscriptionInfo> SubscriptionInfos {get;set}
}

Public Class SubscriptionInfo {
    public int PersonId {get;set;}
    public int SubscriptionId {get;set;}
    public DateTime SubscribedOn {get;set;}

    [RelatedTo(ForeignKey="PersonId")]
    Public virtual Person Person {get;set;}

    [RelatedTo(ForeignKey="SubscriptionId")]
    Public virtual Subscription Subscription {get;set;}
}

var db = new PeopleSubscribedEntities();
var subscription = db.Subscriptions.Find(1);
var people = subscription.SubscriptionInfos.Select(si => si.Person 
                                                  && si => si.SubscribedOn > someDate);

Entity Framework がこのテーブルを多対多として扱うと、余分な属性が失われます。

于 2013-07-24T21:21:26.563 に答える