2008-09-15 70 views
2

我正在設計我的數據庫和LINQ To SQL ASP.NET Web應用程序。LINQ to SQL IsDiscriminator列是否可以繼承?

想象一下,我有兩種類型的頁面:普通和根。有些頁面是根源。有些頁面不是。

我有一個網頁,數據庫表和RootPage數據庫表:

 Page 
     ---- 
    PK PageId 
     HtmlTitle 
     PageHeading 
     MetaDescription 
     IsRoot 

     RootPage 
     -------- 
FK PK PageId 
     FavIcon 
     StyleSheet 
     MasterPage 

我想,如果我的DBML文件中我設置了IsRoot列IsDiscriminator屬性,那麼我RootPage類將繼承Page類。

我希望能夠在我的代碼是這樣工作的:

MyDataContext db = new MyDataContext(); 

var roots = from p in db.Pages 
      where p is RootPage 
      select (RootPage)p; 

或者這樣:

RootPage r = new RootPage(); 
r.HtmlTitle = "Foo"; 
r.FavIcon = "bar.ico"; 
... 
db.Pages.Add(r); 
db.SubmitChanges(); 

一個LINQ to SQL的IsDiscriminator列可以可空還是假的?這會工作嗎?

回答

2

這裏的問題是,你正在嘗試在兩個表之間分割你的類,RootPage和Page。

不幸的是,LINQ to SQL只支持單表繼承,所以這是行不通的。

您需要將兩個表定義合併在一起,並使RootPage特定的字段爲空。例如

Page 
    ---- 
PK PageId 
    HtmlTitle 
    PageHeading 
    MetaDescription 
    IsRoot 
    FavIcon (Nullable) 
    StyleSheet (Nullable) 
    MasterPage (Nullable) 

你可以這樣設置IsRoot是鑑別和標記Page類作爲默認類型,RootPage作爲對「真」的鑑別值的類。

另一種方法是,如果你不介意只讀的東西,那就是製作一個視圖,將兩個表連接在一起,然後將這些類關閉。

第三個選項可能是考慮組合,例如將RootPage表重命名爲Root並在RootPage和Root之間創建關聯。這意味着,而不是你的RootPage類具有所有這些屬性,它只會暴露它們實際駐留的Root屬性。

+1

謝謝。更多的信息在這裏: http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx – 2008-09-16 14:35:10