将相关数据添加到实体框架5中的交叉引用表中(代码优先)

本文关键字:引用 代码 添加 数据 实体 框架 | 更新日期: 2023-09-27 18:24:40

假设我有以下两个模型:

Person             N
Subscription       N

它们处于多对多关系中(每个人可以有多个订阅,每个订阅可以有多个人),因此实体框架创建了一个交叉引用表:

PersonSubscriptions:  PersonId  |  SubscriptionId

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

PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn

我如何使用实体框架实现这一点,以及我如何查询,例如,让所有在X天后订阅的人都订阅给定的订阅?

将相关数据添加到实体框架5中的交叉引用表中(代码优先)

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);

如果实体框架将此表视为多对多,则会丢失额外的属性。