我正在设计我的数据库和LINQ To SQL ASP.NET Web应用程序。
想象一下,我有两种类型的页面:普通和根。有些页面是根。有些页面不是。
我有一个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列是可以为空还是为false?这有用吗?
答案 0 :(得分:2)
这里的问题是你试图在两个表(RootPage和Page。
)之间拆分你的类不幸的是,LINQ to SQL仅支持单表继承,所以这不起作用。
您需要将两个表定义合并在一起,并使特定于RootPage的字段可以为空。 e.g。
Page
----
PK PageId
HtmlTitle
PageHeading
MetaDescription
IsRoot
FavIcon (Nullable)
StyleSheet (Nullable)
MasterPage (Nullable)
然后,您可以将IsRoot设置为鉴别器,并将Page类标记为默认类型,将RootPage标记为鉴别器值为“True”的类。
另一种选择,如果你不介意只读内容就是制作一个将两个表连接在一起的视图,并将这些类基于该类。
第三个选项可能是考虑组合,例如将RootPage表重命名为Root并在RootPage和Root之间创建关联。这意味着,而不是具有所有这些属性的RootPage类,而是只显示它们实际驻留的Root属性。