Может ли столбец LINQ to SQL IsDiscriminator НЕ наследоваться?
-
09-06-2019 - |
Вопрос
Я разрабатываю свою базу данных и веб-приложение 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 там, где они фактически находятся.