2

データベースと LINQ To SQL ASP.NET Web アプリケーションを設計しています。

通常ページとルートページの 2 種類のページがあるとします。一部のページはルートです。一部のページはありません。

Page データベース テーブルと 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 列を null 許容または false にすることはできますか? これは機能しますか?

4

1 に答える 1

2

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

残念ながら、LINQ to SQL は単一テーブルの継承のみをサポートしているため、これは機能しません。

2 つのテーブル定義を一緒にマージし、RootPage 固有のフィールドを null 可能にする必要があります。例えば

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

次に、IsRoot を識別子に設定し、Page クラスをデフォルト タイプとしてマークし、RootPage を識別子値 'True' のクラスとしてマークします。

読み取り専用であることを気にしない場合の代替手段は、2 つのテーブルを結合したビューを作成し、それに基づいてクラスを作成することです。

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

于 2008-09-15T23:02:39.380 に答える