将相关数据添加到 Entity Framework 5 (Code-First) 中的交叉引用表

Posted

技术标签:

【中文标题】将相关数据添加到 Entity Framework 5 (Code-First) 中的交叉引用表【英文标题】:Add related data to cross reference table in Entity Framework 5 (Code-First) 【发布时间】:2013-07-24 17:36:34 【问题描述】:

假设我有以下两个模型:

Person             N
Subscription       N

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

PersonSubscriptions:  PersonId  |  SubscriptionId

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

PersonSubscriptions:  PersonId  |  SubscriptionId  |  SubscribedOn

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

【问题讨论】:

【参考方案1】:

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 将此表视为多对多,您将失去额外的属性。

【讨论】:

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

以上是关于将相关数据添加到 Entity Framework 5 (Code-First) 中的交叉引用表的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 将存储过程添加到数据模型后无法构建

Entity Framework C# - 将数据从一个数据库移动到另一个具有相似结构的数据库

我是不是需要将 RowVersion TimeStamp 类型属性“Entity Framework Code First”添加到父类和子类?

Entity Framework Core OwnsOne 创建单独的表,而不是像预期的那样将属性添加到同一个表中

使用 Entity Framework Core 更新相关数据

添加 [DataContract] 到 Entity Framework 6.0 POCO Template