Могут ли представления 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.

В вашем случае, поскольку кажется, что вы хотите объект только для чтения, вы можете:

  1. раскомментируйте сущность 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 в вашей модели из него.

Другие вопросы по тегам