Entity Framework и супертип / подтип - PullRequest
0 голосов
/ 01 апреля 2011

За отличный совет, который я получил по недавнему вопросу ( Проблема проектирования базы данных ), я включаю шаблон супертипа / подтипа в базу данных, которую создаю для приложения MVC2.Я буду использовать Entity Framework для предоставления моделей в MVC.

Супертипом являются Publications, а подтипами являются Articles, BlogPosts и т. Д. Каждая таблица подтипа будет иметь 2 столбца.составной первичный ключ (pub_id, pub_type) с внешними ключами, которые ссылаются на соответствующие столбцы в таблице супертипа

В целях целостности данных (см. подробные комментарии о принятом решении исходного вопроса) таблица супертипа не должнавключите pub_type в его первичный ключ (в отличие от таблиц подтипов),

И именно здесь Entity Framework, кажется, не играет.Предупреждения, которые я получаю, когда генерирую файл .edmx из моей существующей базы данных:

Отношение 'FK_Articles_Publications' содержит столбцы, которые не являются частью ключа таблицы на первичной стороне отношения.Отношения были исключены.

(и т.скомпрометировать структуру БД и установить составной ключ для таблицы супертипа)?

Если нет, это добавляет дополнительную проблему, требующую присоединения к любой другой таблице, не относящейся к подтипу (и я планирую несколько)для таблицы супертипа требуется наличие столбцов, соответствующих как pub_id, так и pub_type.Например, я хочу, чтобы таблица тем могла связываться с публикациями любого типа через таблицу супертипов - мне нужно было бы хранить (избыточно) pub_type в столбце таблицы тем.

Я довольно новичок в EF (и ORM), но его сила привлекает, и я не хочу отказываться от него.

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

В этой таблице

CREATE TABLE publications (
  pub_id INTEGER NOT NULL PRIMARY KEY,
  pub_type CHAR(1) CHECK (pub_type IN ('A', 'B', 'P', 'S')),
  pub_url VARCHAR(64) NOT NULL UNIQUE,
  CONSTRAINT publications_superkey UNIQUE (pub_id, pub_type)
);

имеет значение, что {pub_id} уникален, а {pub_id, pub_type} уникален.(Столбец pub_type также должен быть объявлен NOT NULL.) В первом случае уникальность гарантирует идентичность.Во втором случае уникальность гарантирует, что подтипы ссылаются на правильный тип строки в супертипе.Но для движка базы данных не имеет большого значения, какой из них объявлен PRIMARY KEY, а какой объявлен UNIQUE.Оба могут быть целью ссылок на внешние ключи.

Если бы dbms были разработаны на основе текущей теории отношений, он мог бы поддерживать только KEY объявлений вместо PRIMARY KEY и NOT NULL UNIQUE.

Поэтому, если ваш ORM не может справиться с ограничениями так, как они написаны, можно сделать {pub_id} первичным ключом во всех этих таблицах и объявить приводимый суперключ {pub_id, pub_type} уникальным во всех этих таблицах.

Я не знаю, заставит ли это замолчать EF.Вы должны проверить таблицы, которые ссылаются на подтипы, а также таблицы, которые ссылаются на супертип.

0 голосов
/ 01 апреля 2011

Попробуйте наследование Table Per Hierarchy , похоже, оно вполне соответствует вашему дизайну.

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