2010-11-03 122 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

我認爲在這種情況下,您應該尊重「繼承構成」。 如果一個人可以同時成爲歌手和演員,那麼繼承顯然是數據結構的錯誤選擇。