2

假设我有以下两个模型:

Person             N
Subscription       N

它们是多对多的关系(每个Person可以有多个Subscription,每个Subscription可以有多个Person),所以Entity Framework创建了一个交叉引用表:

PersonSubscriptions:  PersonId  |  SubscriptionId

如果我想记录每个人何时开始订阅,那么在交叉引用表中有一个 Date 列是最有意义的:

PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn

如何使用 Entity Framework 实现这一点,我将如何查询,例如,让所有在第 X 天之后订阅给定订阅的人?

4

1 回答 1

3

s在这种情况下,您不再有传统意义上的多对多关系,而是与第三个实体有 2 个不同的一对多关系。本质上,您将有 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 回答