Вопрос

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

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

У меня есть таблица базы данных страниц и таблица базы данных 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();

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

Это было полезно?

Решение

Проблема здесь в том, что вы пытаетесь разделить свой класс между двумя таблицами: 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 там, где они фактически находятся.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top