我認爲你是問,「是不是是否我不能使用相關實體作爲每個層次繼承的表的判別符字段?「這是正確的。您需要一個單獨的鑑別器字段來使用每個層次繼承的表。但是,在這種情況下,您可能不需要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