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

时间:2013-12-06 16:27:36

标签: c# entity-framework

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

在我的设计中,每天都会聚合到分配给用户的Report对象中。此Report对象可以有多个Activities。但是,这些活动可以是不同类型的对象。就像一项活动可能是食物而另一种活动可能是运动。我很好奇这种关系是否与我目前的EF设计有关。

我的报告对象无法导航到子项。但是每个子节点(如DbSet或DbSet)都有一个指向父Report对象的链接。拥有Report对象非常重要,因为它链接到目标信息并有助于建立根据目标聚合数据的基础。

有没有办法设置父对象,以便它可以有一个包含多个子对象的子集合,或者设置映射,以便在删除父报表时,这将级联到子活动?或者你会以不同的方式解决这个问题吗?感谢

1 个答案:

答案 0 :(得分:1)

继承是您可以用来将不同类型容纳到单个集合中的方法。创建一个基本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。没有必要为它的子类型创建dbsets,但如果您愿意,也可以。

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-table-per-hierarchy-tph.aspx