将相关数据添加到 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 创建单独的表,而不是像预期的那样将属性添加到同一个表中