2010-11-03 123 views
1

我有一个与TPH相关的问题,我相信。这是场景: 我们有一个名为Artists的表,它具有关于艺术家的一些属性(如名称,minibio等)和一个字节字段,用于确定艺术家的类型,值如下:每个层次结构继承的实体框架表问题

1 - Singer 
2 - Actor 
4 - Composer 
8 - Musician 
16 - Director 

请注意,同一个艺术家可能只是一种或属于多个。让我们来看一个例子:

+-------------------------------------------------+ 
| Table: Artist         | 
+---------------------------------------+---------+ 
| Name         | Kind | 
+---------------------------------------+---------+ 
| Al Pacino        | 2  | (Actor) 
+---------------------------------------+---------+ 
| Mel Gibson       | 18  | (Actor and Director) 
+---------------------------------------+---------+ 
| Dave Matthews       | 15  | (Actor, Singer, Composer and Musician) 
+---------------------------------------+---------+ 

现在,我可以在使用可更新视图与存储过程(CRUD)做TPH。
我也知道这是不可能的(对我来说至少!)使用条件映射来做这件事,因为我不能在条件中使用带有按位或的表达式,如“(Kind | 2)= 2”。

我想过,altenativelly,即改变由德分裂样的领域表结构,为这样的:

+-----------------------------------------------------------------------------------------+ 
| Table: Artist                   | 
+---------------------------------------+-------+--------+----------+----------+----------+ 
| Name         | Actor | Singer | Composer | Musician | Director | 
+---------------------------------------+-------+--------+----------+----------+----------+ 
| Al Pacino        | 1 | 0 | 0  | 0  | 0  | 
+---------------------------------------+-------+--------+----------+----------+----------+ 
| Mel Gibson       | 1 | 0 | 0  | 0  | 1  | 
+---------------------------------------+-------+--------+----------+----------+----------+ 
| Dave Matthews       | 1 | 1 | 1  | 1  | 0  | 
+---------------------------------------+-------+--------+----------+----------+----------+ 

可以工作,但是这样做,虽然我可以使用在该领域创造TPH条件映射,EF(显然)给我一个错误,说明派生实体(Actor,Singer等)是

被映射到表Artist中的相同行。

我的问题是,有其他方法可以做到吗?

在此先感谢。

回答

1

您提出的映射既不是TPH也不是关系型。你也将有一个相当困难的时间将这样的模式映射到任何好的OO模型。您可能也很难有效地查询这样的数据库。在TPH方案中,鉴别器字段保持单个标量值,代表一个类型。这是必要的,因为任何实例只能有一种类型。一个实例的类型在其生命周期中永远不会改变,并且当您将该实例保存到数据库时,该实例的生命周期将永久生效。

因此:我认为以英孚能够理解的任何方式来映射这样一个方案是相当困难的,我认为这不值得。如果这是传统数据,请在数据库或EDMX中进行查看。如果它是一个新的应用程序,我认为你需要重新思考你的模式,并提出一个适合面向对象和关系模型的模型。

0

我认为在这种情况下,您应该尊重“继承构成”。 如果一个人可以同时成为歌手和演员,那么继承显然是数据结构的错误选择。