LINQ to SQL IsDiscriminator 列は継承できないのでしょうか?
-
09-06-2019 - |
質問
データベースと 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 プロパティのみを公開することを意味します。