假设我有以下两个模型:
Person N
Subscription N
它们处于多对多关系中(每个人可以有多个订阅,每个订阅可以有多个人),因此实体框架创建了一个交叉引用表:
PersonSubscriptions: PersonId | SubscriptionId
如果我想在每个人开始订阅时记录,那么在交叉引用表中有一个日期列是最有意义的:
PersonSubscriptions: PersonId | SubscriptionId | SubscribedOn
我如何使用实体框架实现这一点,以及我如何查询,例如,让所有在X天后订阅的人都订阅给定的订阅?
s在这种情况下,您不再有传统意义上的多对多关系,而是与第三个实体有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);
如果实体框架将此表视为多对多,则会丢失额外的属性。