繁体   English   中英

您如何首先在Entity Framework代码中设置不同类型的一对多关系?

[英]How would you setup a one to many relationship of different types in Entity Framework code first?

这是我的设计。 我在考虑父对象在哪里有子对象的集合,每个子对象可以是存储在数据库独立表中的不同类型的对象。

在我的设计中,每天汇总到分配给用户的Report对象中。 该报告对象可以具有多个活动。 但是,这些活动可以是不同类型的对象。 就像一项活动可能是食物,另一项活动可能是运动。 我很好奇,是否存在除我目前的EF设计之外的另一种解决方法。

我的报表对象无法导航到子级。 但是,每个子项(例如DbSet或DbSet)都具有指向父Report对象的链接。 拥有Report对象很重要,因为它链接到目标信息并有助于建立根据目标汇总数据的基础。

有没有一种方法可以设置一个父对象,以便它可以有多个子对象的子集合,或者可以设置映射,以便如果删除父报表,那么它将级联到子活动? 还是您会以不同的方式去做? 谢谢

继承是用于将不同类型容纳到单个集合中的方法。 创建一个基本的Activity类型,在其中放置通用属性(以及其父类的导航属性),然后为每种不同的Activity类型创建一个子类型并添加其特定属性。 我不明白父对象和报表对象是否是同一对象,因此我将假设不是,并定义这两个类。

public class Parent
{
    public int Id { get; set; }
    public ICollection<Activity> Activities { get; set; }
}

public class Report
{
    public int Id { get; set; }
}

public abstract class Activity
{
    public int Id { get; set; }
    public virtual Parent Parent { get; set; }
    public virtual Report Report { get; set; }
    // common activity properties
}

public class Food : Activity
{
    // Food specific properties
}

public class Excercise : Activity
{
    // Exercise specific properties
}

然后,您可以为ParentReportActivity创建一个DbSet。 无需为其子类型创建dbset,但是可以(如果需要)创建它。

public DbSet<Parent> Parents { get; set; }
public DbSet<Report> Reports { get; set; }
public DbSet<Activity> Activities { get; set; }

您可以通过以下方式查询特定的活动子类型:

var indoorExercises = context.Activities.OfType<Exercise>().Where(e => e.IsIndoor);

您可以通过此链接获取更多信息: http : //weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1每个层次结构表tph.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM