質問

データベースと 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 列は Nullable または false にできますか?これはうまくいきますか?

役に立ちましたか?

解決

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

残念ながら、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 プロパティのみを公開することを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top