Может ли столбец IsDiscriminator LINQ to SQL НЕ наследоваться?

Я разрабатываю свою базу данных и веб-приложение LINQ To SQL ASP.NET.

Представьте, что у меня есть два типа страниц: обычные и корневые. Некоторые страницы являются корнями. Некоторые страницы нет.

У меня есть таблица базы данных страниц и таблица базы данных RootPage:

      Page
      ----
   PK PageId
      HtmlTitle
      PageHeading
      MetaDescription
      IsRoot

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

Я думаю, что если в моем файле DBML я установил свойство IsDiscriminator столбца IsRoot, то мой класс 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();

Может ли столбец IsDiscriminator LINQ to SQL иметь значение NULL или false? Это сработает?


person Zack Peterson    schedule 15.09.2008    source источник


Ответы (1)


Проблема здесь в том, что вы пытаетесь разделить свой класс между двумя таблицами, RootPage и Page.

К сожалению, LINQ to SQL поддерживает наследование только одной таблицы, поэтому это не сработает.

Вам нужно будет объединить два определения таблиц вместе и сделать поля, относящиеся к RootPage, допускающими значение NULL. например

   Page
   ----
PK PageId
   HtmlTitle
   PageHeading
   MetaDescription
   IsRoot
   FavIcon (Nullable)
   StyleSheet (Nullable)
   MasterPage (Nullable)

Затем вы должны установить IsRoot в качестве дискриминатора и пометить класс Page как тип по умолчанию, а RootPage как класс для значения дискриминатора True.

Альтернативой, если вы не возражаете, чтобы вещи были доступны только для чтения, было бы создание представления, которое объединило бы две таблицы вместе и основало классы на этом.

Третий вариант может заключаться в рассмотрении композиции, такой как переименование таблицы RootPage в Root и создание связи между RootPage и Root. Это означало бы, что вместо того, чтобы ваш класс RootPage имел все эти свойства, он вместо этого предоставил бы только свойство Root там, где они фактически находятся.

person DamienG    schedule 15.09.2008
comment
Спасибо. Дополнительная информация здесь: blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/01/ - person Zack Peterson; 16.09.2008