Может ли столбец LINQ to SQL IsDiscriminator НЕ наследовать? - PullRequest
2 голосов
/ 16 сентября 2008

Я проектирую свою базу данных и веб-приложение 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 быть обнуляемым или ложным? Будет ли это работать?

1 Ответ

2 голосов
/ 16 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...