невозможно добавить вид в edmx - PullRequest
25 голосов
/ 06 июня 2011

При попытке добавить представление к файлу edmx ничего не происходит.
Я открыл файл edmx с помощью редактора wxl и заметил следующую ошибку:

предупреждение 6013: таблица /для представления 'CellularOrders.dbo.V_LINK' не определен первичный ключ, и не может быть выведен действительный первичный ключ.Эта таблица / представление была исключена.Чтобы использовать сущность, вам нужно будет пересмотреть свою схему, добавить правильные ключи и раскомментировать ее.

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

Итак, в БД я обновил таблицу T_LINK и сделал одно из полей, отражающих представление, в качестве основногоключ.А потом, когда я снова попытался добавить представление в edmx, ничего не случилось снова.

Как я могу решить эту проблему ??Есть ли возможность исправить это, ничего не делая с таблицей?Могу ли я добавить другое представление, которое каким-то образом обернет старое представление, но с фиксированными свойствами?

Ответы [ 4 ]

31 голосов
/ 24 апреля 2012

Просто добавьте столбец к вашему представлению. Я добавил Row_Number, чтобы создать ключ, подобный этому

SELECT ISNULL(CAST((row_number() OVER (ORDER BY tab.ENTRYDATE)) AS int), 0) 
AS EDMXID,...other columns go on

Выражение табуляции - это псевдоним таблицы, а entrydate - это просто поле, необходимое для номера строки, встроенного в функцию sql-server.

Вы можете выбрать разные способы, например,

select newid() as MYEDMXID,....so on

Надежда Помогает

28 голосов
/ 06 июня 2011

Каждая таблица или представление, добавляемое в модель сущности, должно иметь некоторый ключ. Это на самом деле не должно быть первичным ключом. Если в таблице не определен первичный ключ, EF попытается вывести ключ, используя простое правило: он будет принимать все необнуляемые не вычисляемые недвоичные столбцы и помечает их как ключ сущности. Если такого столбца не существует, сущность не может быть добавлена ​​автоматически, и дизайнер выдаст упомянутое предупреждение. Обходной путь - добавить представление вручную и выбрать ключ самостоятельно, но как только вы это сделаете, вы не сможете использовать Обновление из базы данных , поскольку оно всегда будет перезаписывать ваши изменения.

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

2 голосов
/ 13 декабря 2016

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

Вот пример:

CREATE VIEW dbo.myView
AS
SELECT
	-- This column enables EF-import via designer by enabling PK generation
	Id,
	-- These columns belong to the view
	[Count],
	[Sum]
FROM
(
SELECT
	COUNT(*) AS [Count]
	,SUM(1) AS [Sum]
FROM
	dbo.myTable
) TheViewItself
-- Grab a primary key of a single row from atable
INNER JOIN (SELECT TOP 1 Id FROM dbo.TableWithPrimaryKey) Id ON 1 = 1

Предикат соединения "ON 1 = 1" выглядит странно. Но мне нужно было это, чтобы убедить EF импортировать представление.

1 голос
/ 05 сентября 2014

Используйте новую таблицу только для связи с вашими представлениями, если у вас более 100 тыс. Строк, EF6 не лучшее решение;)

CREATE TABLE dbo.TablePrimate(Id int CONSTRAINT PK_TablePrimate PRIMARY KEY (Id))
go
set nocount on;
DECLARE @i int;
set @i=1
WHILE @i<10000
BEGIN
    INSERT dbo.TablePrimate(Id) values(@i)
    SET @i = @i + 1
END
--In fews seconds & 1 MB of storage
GO

Теперь присоединяется к «MyView»

CREATE VIEW dbo.vwTickets
AS
SELECT TP.Id, MyPKView.* FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Ticket) Line, MyView.*
    FROM (
        select Grupo, App, Ticket, Titulo, FApertura, Estado, Tipo from dbo.vwEvolutivos 
        union 
        select Grupo, App, Ticket, Titulo, FApertura, Estado, Tipo from dbo.vwIncidencias
    ) MyView
) MyPKView
    JOIN dbo.TablePrimate TP ON TP.Id = Line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...