关于.net:LINQ to SQL IsDiscriminator列不能继承吗?

关于.net:LINQ to SQL IsDiscriminator列不能继承吗?

Can a LINQ to SQL IsDiscriminator column NOT inherit?

我正在设计数据库和LINQ To SQL ASP.NET Web应用程序。

想象一下,我有两种类型的页面:普通页面和根页面。 有些页面是根。 有些页面没有。

我有一个Page数据库表和一个RootPage数据库表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
      Page
      ----
   PK PageId
      HtmlTitle
      PageHeading
      MetaDescription
      IsRoot

      RootPage
      --------
FK PK PageId
      FavIcon
      StyleSheet
      MasterPage

我认为,如果在我的DBML文件中设置了IsRoot列的IsDiscriminator属性,那么我的RootPage类将继承Page类。

我希望能够在我的代码中像这样工作:

1
2
3
4
5
MyDataContext db = new MyDataContext();

var roots = from p in db.Pages
            where p is RootPage
            select (RootPage)p;

或像这样:

1
2
3
4
5
6
RootPage r = new RootPage();
r.HtmlTitle ="Foo";
r.FavIcon ="bar.ico";
...
db.Pages.Add(r);
db.SubmitChanges();

LINQ to SQL IsDiscriminator列可以为空还是假? 这样行吗?


这里的问题是您试图在两个表RootPage和Page之间拆分类。

不幸的是,LINQ to SQL仅支持单表继承,因此这行不通。

您需要将两个表定义合并在一起,并使特定于RootPage的字段为空。 例如

1
2
3
4
5
6
7
8
9
10
   Page
   ----
PK PageId
   HtmlTitle
   PageHeading
   MetaDescription
   IsRoot
   FavIcon (Nullable)
   StyleSheet (Nullable)
   MasterPage (Nullable)

然后,您可以将IsRoot设置为鉴别符,并将Page类标记为默认类型,并将RootPage标记为鉴别符值为'True'的类。

如果您不介意只读的话,另一种方法是创建一个将两个表连接在一起的视图,并以此为基础创建类。

第三种选择可能是考虑组成,例如将RootPage表重命名为Root并在RootPage和Root之间创建关联。 这意味着,除了您的RootPage类具有所有这些属性之外,它只会公开它们实际所在的Root属性。


推荐阅读