2009-02-12 180 views
1

我剛開始與實體框架和有以下問題:實體框架 - 繼承

我有一個包含導航屬性一個網站實體。

我有應當遺傳形式段落多個實體(即ImageParagraphLinkListParagraph)。

我想查詢一個網站對象並訪問其並根據他們的具體類型(即ImageParagraphLinkListParagraph)與他們合作。

它可以使用Table Per Hierarchy方法(有條件),但是我最終會遇到一個非常髒的解決方案。根據段落ID來查詢具體類型是可行的,但我希望有一種更好的解決方案。

我想查詢一個網站,並顯示在第(ImageParagraphLinkListParagraph)一些網站的相關資料和數據。我不知道如何設置映射的方式,有可能檢索ImageParagraph,LinkListParagraph對象直接覆蓋段落導航屬性。

你會如何解決這個問題?

ER-圖:http://img443.imageshack.us/img443/46/69863714ks0.jpg

alt text http://img443.imageshack.us/img443/46/69863714ks0.jpg

回答

2

如果你想與他們合作他們的具體類型的基於 - 這聽起來像一個案例多態性...你(在部分類)添加幾個方法?

partial class Paragraph { 
    public abstract void Foo(); 
} 
partial class ImageParagraph { 
    public override void Foo() {/*code*/} 
} 
partial class LinkListParagraph { 
    public override void Foo() {/*code*/} 
} 

否則,如果你要過濾的設置,可以使用OfType擴展方法 - 即

foreach(var imgPara in obj.Paragraphs.OfType<ImageParagraph>()) 
{ ... } 

也許你能過爲上述添加(父對象)的屬性 - 即

partial class Site { 
    public IQueryable<ImageParagraph> ImageParagraphs 
    { get {return Paragraphs.OfType<ImageParagraph>(); }} 

    public IQueryable<LinkListParagraph> LinkListParagraphs 
    { get {return Paragraphs.OfType<LinkListParagraph>(); }} 
} 
+0

Thanks.My問題是unclear.I想做的事: VAR網站= context.Site.Include( 「段」),將(C => c.SiteID == 1)。首先(); foreach(site.Paragraphs中的var段落){do something}; 我的問題是,我不知道在EDM中的映射(如帶有條件的每個層次的表) – chbu 2009-02-12 12:15:36