Не может добавить вид в edmx

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Надежды помогают

Ответ 3

Использовать новую таблицу только для связи с вашими представлениями, если у вас более ста тысяч строк, 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

Ответ 4

Почему бы просто не преобразовать режим просмотра в хранилище. Я попытался без проблем импортировать в модель EDMX и не добавлять новые столбцы.

Ответ 5

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

Вот пример:

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