Могут ли представления SQL Server иметь первичные и внешние ключи?
Можно ли определить первичные и внешние ключи для представлений базы данных в Microsoft SQL Server Management Studio? Как?
Я пытаюсь создать модель данных объекта ADO.NET для чтения из четырех старых, плохо сформированных таблиц базы данных, которые я не могу изменить. Я создал вид только тех данных, которые мне нужны.
Четыре представления должны отображаться в простой EDMX из трех объектов с одним отношением "многие ко многим".
Я получаю эту ошибку при создании моей модели данных:
Для таблицы / представления '...' не определен первичный ключ, и не может быть выведен действительный первичный ключ. Эта таблица / представление была исключена. Чтобы использовать сущность, вам необходимо просмотреть свою схему, добавить правильные ключи и раскомментировать ее.
Он правильно вывел первичные ключи двух представлений. Но не удалось сделать это с двумя другими.
Одно из моих проблемных представлений использует агрегатные функции:
SELECT MAX(...) ... GROUP BY ...
Другой должен иметь составной первичный ключ из двух внешних ключей.
3 ответа
Вы должны определить свое мнение так, чтобы оно:
- Включает в себя все
PRIMARY KEY
столбцы - Не использует
JOIN
"s - Не использует какие-либо агрегатные функции или
UNION
"s
Любая строка в вашем представлении должна соответствовать ровно одной строке таблицы.
В одном из моих проблемных представлений используются агрегатные функции
Это не может быть обновлено. Для объекта только для чтения, решение здесь:
Если никакой ключ не может быть выведен, комментарий к коду, который содержит соответствующий элемент EntityType (без элементов Key), добавляется в раздел SSDL файла.edmx.
В вашем случае, поскольку кажется, что вы хотите объект только для чтения, вы можете:
- раскомментируйте сущность SSDL
- пометить одно / несколько свойств как Nullable="False"
- добавить соответствующие ключевые элементы
- добавить соответствующий определяющий запрос.
По второму вопросу:
Другой должен иметь составной первичный ключ из двух внешних ключей.
Из документации:
Таблица, которая представляет отношение "многие ко многим" между двумя таблицами в базе данных, может не иметь эквивалентной сущности в концептуальной схеме. Когда
EDM
инструменты встречают такую таблицу без столбцов, отличных от двух, которые являются внешними ключами; таблица сопоставления представляется в концептуальной схеме как ассоциация "многие ко многим" вместо сущности.
Вы можете изменить свои взгляды, создав NOT NULL
Индекс столбца по вашему мнению делает что-то вроде этого:
ALTER VIEW [dbo].[ViewName]
AS
SELECT ISNULL(CAST(CASE ROW_NUMBER() OVER ( ORDER BY columnNames )
WHEN ROW_NUMBER() OVER ( ORDER BY columnNames )
THEN ROW_NUMBER() OVER ( ORDER BY columnNames )
ELSE 0
END AS INT), 0) AS ID
На самом деле, вы можете создать представление, которое использует JOIN и генерировать и Entity в вашей модели из него.