2011-06-06 29 views
24

Al intentar agregar una vista al archivo edmx, no ocurre nada.
Abrí el archivo edmx utilizando el editor de ancho x largo y me di cuenta del error siguiente:no se puede agregar vista a edmx

warning 6013: The table/view 'CellularOrders.dbo.V_LINK' does not have a primary key defined and no valid primary key could be inferred. This table/view has been excluded. To use the entity, you will need to review your schema, add the correct keys, and uncomment it.

(cosa importent - no lo hice y no es necesario añadir la mesa que el punto de vista basado en la edmx. Además, la vista es solo para hacer declaraciones selectas en los datos)

Por lo tanto, en el archivo db, actualicé la tabla T_LINK e hice uno de los campos que se refleja en la vista como clave principal. Y luego, cuando intenté nuevamente agregar la vista al edmx, nada volvió a ocurrir.

¿Cómo puedo solucionar esto? ¿Existe una opción para arreglar esto sin hacer nada en la mesa? ¿Puedo agregar otra vista que de alguna forma ajuste la vista anterior pero con propiedades fijas?

+2

EF es para "Enterprisey Fail". Este problema * aún * afecta EF6.1 - las advertencias # 6002 son malas, pero # 6013 "se ha excluido" errores y ni siquiera generar una vista del modelo de base de datos es * fail *. Basura. – user2864740

Respuesta

20

Cada tabla o vista agregada al modelo de entidad debe tener alguna clave. En realidad, no tiene que ser la clave principal. Si la tabla no tiene definida la clave primaria, EF intentará inferir una clave usando una regla simple: tomará todas las columnas no binarias no compilables no binarias y las marcará como una clave de entidad. Si no existe ninguna de esas columnas, la entidad no se puede agregar automáticamente y el diseñador lanzará la advertencia mencionada. La solución es agregar la vista manualmente y seleccionar la clave, pero una vez que lo haga no puede usar la actualización de la base de datos porque siempre sobrescribirá los cambios.

Su clave definida debe ser única, de lo contrario puede tener algunos otros problemas relacionados con identity map utilizados internamente.

+1

Marqué uno de los campos de la tabla como clave principal pero el EF todavía no carga la vista y dice el mismo problema. La vista no tiene claves principales, pero sí tablas. ¿Cómo sabe EF qué campo es la clave principal de una vista? – Naor

+0

También tuve el mismo problema. Cambié la tabla marcando una columna como clave principal, _Actualización del modelo de la base de datos_, pero no pasó nada. Así que eliminé y recreé la Vista en la Base de datos. Al hacerlo, EF ha podido importar la Vista, pero ahora aparece este error: ' ' – spiderman77

25

Sólo tiene que añadir una columna a la vista he añadido un ROW_NUMBER para crear una clave como esto

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

la expresión pestaña es alias de la tabla y el ENTRYDATE es sólo un campo necesario para row_number construida en func sql-server .

puede elegir de diferentes maneras, por ej.

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

Esperanza ayuda a

+0

De esta forma debe agregar ORDER BY ya que los resultados pueden estar en orden diferente y, por lo tanto, la identificación no será única. – Naor

+1

Sí, tiene razón, estas identificaciones no son identificaciones reales, son simplemente virtuales. Usted administra los índices y los ordena a mano. No son para uso real. Solo una sugerencia. El modelo de eficiencia solo busca identificaciones reales, pero cuando sabes que los índices están bien. Pero no puedes agregarlos a edmx. –

+0

Mi solución solo es válida cuando no trabaja con clases de servicio de dominio generadas por defecto. Si gestiona con su costumbre, presente estas consultas y operaciones de invocación. ayuda. De lo contrario, como dijiste, las entidades serán diferentes. Y tu última oración es tan buena como se muestra en mi segundo ejemplo. vista de la envoltura –

0

Utilice una nueva tabla sólo para el enlace con sus puntos de vista, si su tenga más de 100k filas, EF6 no su solución mejor;)

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 

Ahora se une a " 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 
0

¿Por qué no simplemente convierte la vista a un procedimiento de almacenamiento? Intenté sin ningún problema importar al modelo EDMX y sin agregar nuevas columnas.

+0

Una vista es composable y más flexible que un procedimiento almacenado. Aunque podría ser una solución en algunos casos, pero definitivamente no es la solución general. –

0

Puede resolver fácilmente este problema uniendo su vista con cualquier tabla arbitraria con una columna principal. Solo asegúrate de agarrar solo una fila de la mesa.

Aquí se muestra un ejemplo:

CREATE VIEW dbo.myView 
 
AS 
 
SELECT 
 
\t -- This column enables EF-import via designer by enabling PK generation 
 
\t Id, 
 
\t -- These columns belong to the view 
 
\t [Count], 
 
\t [Sum] 
 
FROM 
 
(
 
SELECT 
 
\t COUNT(*) AS [Count] 
 
\t ,SUM(1) AS [Sum] 
 
FROM 
 
\t 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" join predicado parece extraño.Pero necesitaba esto para convencer a EF de importar la vista.

Cuestiones relacionadas