我认为你是问,“是不是是否我不能使用相关实体作为每个层次继承的表的判别符字段?“这是正确的。您需要一个单独的鉴别器字段来使用每个层次继承的表。但是,在这种情况下,您可能不需要ResourceType
实体,因为实体本身的特定类型足以告诉您要使用哪个图标。
但是,我会质疑继承是否是正确的设计。
在O/R映射中使用继承总是有点妥协,因为您要么使用像每个层次结构的表格这样的设计,它不会自然映射到格式良好的关系模式,或者像表格类型,这意味着数据库服务器必须更加努力才能提供即使是简单的列表。我认为对于O/R映射来说,“Favor composition over inheritance”的通用设计指南尤其比OOD一般更适合。
我明白,你已经添加的图像只是一个例子来说明你的问题,你的真正的设计可能比较复杂,但让我们使用它作为一个例子:
图中的亚型(Application
,File
等)只有一个属性不属于父类型。对于许多子类型,“额外”属性是相同的,Link
。其中一个有不同的属性(Filename
),但我会注意到文件名可以表示为URI。
除了您在图中显示的继承设计之外,还可以在不使用继承的情况下对此设计进行建模。在这种情况下,您将删除子类型,但保留ResourceType
实体。
现在让我们考虑一些样本查询,可能是什么样子,每个设计:
// get books with inheritance:
var bi = from b in Context.RelatedResources.OfType<Book>()
select b;
// without
var bc = from b in Context.Resources
where b.ResourceType.ID == ResourceType.Book // static property you define on ResourceType
select b;
无论是一个令我非常糟糕。对我而言,这足以不使用继承。在O/R映射中继承最有吸引力的优点是能够在单个列表中轻松检索不同子类型的实体。但是你已经可以用这个设计来做到这一点。因为组合设计更容易实现,不太复杂,并且会更有效地使用你的数据库,所以我会更喜欢它,除非继承有强大的优势,这在我看不到。
结合如何?把它们变成一个单一的实体类型?目前还不清楚你想在这里做什么。你能画出你想看到的结果吗? – 2010-02-05 15:36:22
对不起。我将尝试清除它...我想让relatedResource实体具有来自resourcetype实体的类型名称和图标属性,这样我可以将relatedResources设置为抽象实体并为从相关资源继承的每个类型创建不同的实体。我目前不能这样做,因为)如果我理解正确),框架不支持同一实体的继承和遏制。 – Mike 2010-02-05 16:04:02