web-dev-qa-db-fra.com

ne peut pas ajouter de vue à l'edmx

En essayant d'ajouter une vue au fichier edmx, rien ne se passe.
J'ai ouvert le fichier edmx en utilisant l'éditeur wxl et j'ai remarqué l'erreur suivante:

avertissement 6013: La table/vue 'CellularOrders.dbo.V_LINK' ne le fait pas avoir une clé primaire définie et no clé primaire valide peut être déduite . Ce tableau/vue a été exclu. À utiliser l'entité, vous aurez besoin de examinez votre schéma, ajoutez le correct clés, et décommenter.

(Ce qui est important - je n'ai pas et n'ai pas besoin d'ajouter la table sur laquelle la vue est basée sur edmx. De plus, la vue sert uniquement à la sélection d'instructions sur les données)

Ainsi, dans la base de données, j'ai mis à jour la table T_LINK et créé l'un des champs qui reflète la vue en tant que clé primaire. Et puis, quand j'ai essayé à nouveau d'ajouter la vue à l'edmx, rien ne se reproduit.

Comment puis-je résoudre ceci?

25
Naor

Chaque table ou vue ajoutée au modèle d'entité doit avoir une clé. En fait, il n'est pas nécessaire que ce soit la clé primaire. Si la table n'a pas la clé primaire définie, EF essaiera d'inférer une clé à l'aide d'une règle simple: toutes les colonnes non binaires non calculées et non nullables seront considérées et marquées comme clé d'entité. Si aucune colonne de ce type n'existe, l'entité ne peut pas être ajoutée automatiquement et le concepteur lève l'avertissement mentionné. La solution consiste à ajouter manuellement la vue et à sélectionner la clé vous-même, mais vous ne pouvez pas utiliser Update à partir de la base de données car cela effacera toujours vos modifications.

Votre clé définie doit être unique, sinon vous pouvez avoir d'autres problèmes liés à carte d'identité utilisés en interne.

28
Ladislav Mrnka

Ajoutez simplement une colonne à votre vue. J'ai ajouté un Row_Number pour créer une clé comme celle-ci.

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

l'expression de tabulation est un alias de table et entrydate est simplement un champ nécessaire pour row_number construit dans sql-server func.

vous pouvez choisir différentes manières, par exemple 

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

L'espoir aide

29
Davut Gürbüz

Utilisez une nouvelle table uniquement pour le lien avec vos vues, si vous avez plus de 100 000 lignes, EF6 n'est pas sa meilleure solution;)

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

Se joint maintenant avec "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
1
Fastorro

Vous pouvez facilement résoudre ce problème en joignant votre vue à n’importe quelle table arbitraire avec une colonne primaire. Assurez-vous simplement de ne saisir qu'une seule ligne de la table.

Voici un exemple:

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", le prédicat de jointure semble étrange. Mais j'avais besoin de cela pour convaincre EF d'importer la vue.

0
user2145393