LINQ to SQL IsDiscriminator列不能继承吗?
时间:2020-03-05 18:54:43 来源:igfitidea点击:
我正在设计数据库和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列可以为空还是假?这样行吗?
解决方案
回答
这里的问题是我们试图在两个表RootPage和Page之间拆分类。
不幸的是,LINQ to SQL仅支持单表继承,因此这行不通。
我们需要将两个表定义合并在一起,并使特定于RootPage的字段可为空。例如
Page ---- PK PageId HtmlTitle PageHeading MetaDescription IsRoot FavIcon (Nullable) StyleSheet (Nullable) MasterPage (Nullable)
然后,我们可以将IsRoot设置为鉴别器,并将Page类标记为默认类型,并将RootPage标记为" True"鉴别器值的类。
如果我们不介意只读的话,另一种方法是创建一个将两个表连接在一起的视图,并以此为基础创建类。
第三种选择可能是考虑组成,例如将RootPage表重命名为Root并在RootPage和Root之间创建关联。这意味着,除了RootPage类具有所有这些属性之外,它只会公开它们实际所在的Root属性。