这是我的设计。我正在考虑父对象在哪里有一个子对象集合,其中每个子对象可以是存储在数据库中独立表中的不同类型的对象。
在我的设计中,每天都会聚合到分配给用户的Report对象中。此Report对象可以有多个Activities。但是,这些活动可以是不同类型的对象。就像一项活动可能是食物而另一种活动可能是运动。我很好奇这种关系是否与我目前的EF设计有关。
我的报告对象无法导航到子项。但是每个子节点(如DbSet或DbSet)都有一个指向父Report对象的链接。拥有Report对象非常重要,因为它链接到目标信息并有助于建立根据目标聚合数据的基础。
有没有办法设置父对象,以便它可以有一个包含多个子对象的子集合,或者设置映射,以便在删除父报表时,这将级联到子活动?或者你会以不同的方式解决这个问题吗?感谢
答案 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
}
然后,您可以为Parent
,Report
和Activity
创建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);