2008-09-15 13 views
2

私はデータベースとLINQ To SQL ASP.NET Webアプリケーションを設計しています。LINQ to SQL IsDiscriminator列は継承できませんか?

普通とルートの2種類のページがあるとします。一部のページはルーツです。一部のページは表示されません。

私はページのデータベーステーブルと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 SQL IsDiscriminatorの列がNULL可能か偽ことはできますか?これは使えますか?

答えて

2

ここでの問題は、クラスをRootPageとPageの2つのテーブルに分割しようとしていることです。

LINQ to SQLは単一テーブルの継承しかサポートしていないため、これは機能しません。

2つのテーブル定義を結合し、RootPage固有のフィールドをNULLにする必要があります。例えば

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

その後、弁別することと「真」の弁別値のためのクラスであるとして、デフォルトのタイプとRootPageとPageクラスをマークするIsRootを設定します。

あなたが読んでいるだけのことを気にしなかった場合は、2つのテーブルを結合してそのクラスを基にしたビューを作成することです。

第3のオプションは、RootPageテーブルの名前をRootに変更し、RootPageとRootの間に関連付けを作成するなどの構成を検討することです。これは、これらのプロパティをすべて持つRootPageクラスの代わりに、実際に存在するRootプロパティのみを公開することを意味します。

+1

ありがとうございました。詳細はこちら: http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/linq-to-sql-inheritance.aspx –

関連する問題