Могут ли представления SQL Server иметь первичные и внешние ключи? - PullRequest
9 голосов
/ 14 апреля 2009

Можно ли определить первичные и внешние ключи для представлений базы данных в Microsoft SQL Server Management Studio? Как?

Я пытаюсь создать модель данных объекта ADO.NET для чтения из четырех старых, плохо сформированных таблиц базы данных, которые я не могу изменить. Я создал виды только тех данных, которые мне нужны.

Четыре вида должны отображаться в простой EDMX из трех сущностей с одним отношением «многие ко многим».

Я получаю эту ошибку при создании моей модели данных:

Таблица / представление '...' не имеет первичный ключ определен и не действителен Первичный ключ может быть выведен. это таблица / вид был исключен. Использовать сущность, которую вам нужно будет пересмотреть вашей схемы, добавьте правильные ключи и раскомментируйте его.

Он правильно вывел первичные ключи двух представлений. Но не смогли сделать это с двумя другими.

В одном из моих проблемных представлений используются агрегатные функции:

SELECT MAX(...) ... GROUP BY ...

Другой должен иметь составной первичный ключ из двух внешних ключей.

Ответы [ 3 ]

7 голосов
/ 14 апреля 2009

Вам нужно определить свой вид так, чтобы он:

  • Включает все столбцы PRIMARY KEY
  • Не использует JOIN
  • Не использует агрегатные функции или UNION

Любая строка в вашем представлении должна соответствовать ровно одной строке таблицы.

В одном из моих проблемных представлений используются агрегатные функции

Это не может быть обновлено. Для объекта только для чтения решение от здесь :

Когда не может быть выведен ключ, комментарий кода, который содержит соответствующий элемент EntityType (без элементов Key), добавляется в секцию SSDL файла .edmx.

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

  1. раскомментировать сущность SSDL
    • отметить одно или несколько свойств как Nullable = "False"
    • добавить соответствующие ключевые элементы
    • добавить соответствующий определяющий запрос.

По второму вопросу:

Другой должен иметь составной первичный ключ из двух внешних ключей

С документация :

Таблица, которая представляет отношение «многие ко многим» между двумя таблицами в базе данных, может не иметь эквивалентной сущности в концептуальной схеме. Когда инструменты EDM встречают такую ​​таблицу без столбцов, кроме двух, которые являются внешними ключами, таблица сопоставления представляется в концептуальной схеме как ассоциация «многие ко многим» вместо сущности.

2 голосов
/ 11 августа 2011

Вы можете изменить свои представления, создав индексный столбец 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 
0 голосов
/ 10 декабря 2010

На самом деле, вы можете создать представление, которое использует JOIN, и сгенерировать и Entity в вашей модели из него.

...