【问题标题】:Can a LINQ to SQL IsDiscriminator column NOT inherit?LINQ to SQL IsDiscriminator 列不能继承吗?
【发布时间】:2010-09-09 05:17:49
【问题描述】:

我正在设计我的数据库和 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 列可以为空还是假?这行得通吗?

【问题讨论】:

    标签: .net asp.net linq linq-to-sql inheritance


    【解决方案1】:

    这里的问题是您试图将您的类拆分为两个表,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 属性。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2012-03-24
    • 2011-06-27
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多