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

C# 将相关数据添加到实体框架5中的交叉引用表中(代码优先),c#,many-to-many,entity-framework-5,code-first,cross-reference,C#,Many To Many,Entity Framework 5,Code First,Cross Reference,假设我有以下两种模型: Person N Subscription N 它们处于多对多关系中(每个人可以有多个订阅,每个订阅可以有多个人),因此实体框架创建了一个交叉引用表: PersonSubscriptions: PersonId | SubscriptionId PersonSubscriptions: PersonId | SubscriptionId | SubscribedOn 如果我想记录每个人开始订阅的时间,最好在交叉引用

假设我有以下两种模型:

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

PersonSubscriptions:  PersonId  |  SubscriptionId
PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn
如果我想记录每个人开始订阅的时间,最好在交叉引用表中有一个日期列:

PersonSubscriptions:  PersonId  |  SubscriptionId
PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn

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

在这种情况下,您不再具有传统意义上的多对多关系,而是与第三个实体有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);
公共类人物{
公共int PersonId{get;set;}
公共虚拟IEnumerable SubscriptionInfo{get;set;}
}
公开课订阅{
公共int SubscriptionId{get;set;}
公共虚拟IEnumberable subscriptionInfo{get;set}
}
公共类订阅信息{
公共int PersonId{get;set;}
公共int SubscriptionId{get;set;}
在{get;set;}上订阅公共日期时间
[与(ForeignKey=“PersonId”)相关]
公共虚拟人{get;set;}
[RelatedTo(ForeignKey=“SubscriptionId”)]
公共虚拟订阅{get;set;}
}
var db=新的用户订阅();
var subscription=db.Subscriptions.Find(1);
var people=subscription.subscriptioninfo.Select(si=>si.Person
&&si=>si.SubscribedOn>someDate);

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

谢谢,Andrew!您希望您的示例代码按照我在问题中概述的那样创建表吗?还是一个单独的SubscriptionInfo表?我只是在示例中将其称为SubscriptionInfo,但如果它被命名为PersonSubscriptions,它将创建一个名为PersonSubscriptions的表,其中包含3个字段。。。我主要是提供了一个使用代码的方向,但是名称当然可以更改。使用我使用的类名,Entity Framework将创建SubscriptionInfo表,而不是默认的联接表。